【问题标题】:Why can I generate char beyond max value?为什么我可以生成超出最大值的字符?
【发布时间】:2015-08-28 09:18:26
【问题描述】:

为什么下面的代码会产生错误?

System.out.println((char) 2147483647);

根据oracle datatypeschar 的最大大小为65,535

  • char:char 数据类型是单个 16 位 Unicode 字符。它的最小值为“\u0000”(或 0),最大值为“\uffff”(或 65,535 包括在内)。

【问题讨论】:

  • 它打印什么?不是2147483647。为什么不?这就是你的答案...
  • 它进行了缩小转换,2147483647 是一个 int,而您将其缩小为一个字符。正如你所提到的,char 的最大值是 65535。如果你这样做,System.out.println((int)(char)2147483647); ,你会看到它打印的是 65535 而不是 2147483647。HTH

标签: java char


【解决方案1】:

为什么我可以生成超出最大值的字符?

2147483647 不是 char 而是 int

您没有为char 分配无效值,而是将有效的int 转换为char,然后应用缩小基元转换 规则。见Java specs§5.1.3

简而言之,您保留原始整数的最低 16 位(“有符号整数到整数类型 T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示的位数键入 T。”)。

为什么下面的代码没有报错?

因为它不是错误,所以它是一种定义明确的行为。

【讨论】:

  • 一个int,而不是Integer
  • @immibis 不是Integer,而是int! ;) 是的,谢谢。最初它是整数
【解决方案2】:

您进行从intchar 的缩小转换,这是允许的see java spec: 5.1.3. Narrowing Primitive Conversion

有符号整数到整数类型T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值大小的信息外,这还可能导致结果值的符号与输入值的符号不同。

生成的char 不大于Character.MAX_VALUE。 编译器将(char) 2147483647 转换为65535

【讨论】:

    【解决方案3】:

    char 是一种 16 位数据类型,可以将数值转换为。

    当您将 32 位整数转换为 16 位短整数(或字符)时,您会丢失源代码的高位。

    Int32 i = 2147483647; // 0x7FFFFFFF
    Int16 s = (Int16) i;  //     0xFFFF (65535)
    char  c = (char)  i;  //     0xFFFF (65535)
    

    【讨论】:

      【解决方案4】:

      这适用于任何数据类型,它被称为 integer overflow,并且在转换任何超出您要转换的类型大小的位时都会被切断。

      【讨论】:

      • 一半。是的字节被丢弃。不,与溢出无关。
      【解决方案5】:

      实际上,您的问题的答案是您不能

      为什么你没有看到任何错误?
      因为Character.MAX_VALUE + 1 = Character.MIN_VALUE... 与Integer.MAX_VALUE 等一样,JVM 将其视为循环以避免此类问题... 但在尝试计算时会给出错误结果... .

      查看this question 了解更多技术信息

      【讨论】:

      • 溢出?不... 16 MSB 位被丢弃。
      • @AdrianoRepetti 我引用了链接的问题.. 但我如何理解它可以尝试溢出...但不会发生...
      • 施法时没有溢出。最重要的数据只是丢失了。这与旧语言(如 C++)的行为相同。转换原语是开发人员的说法,“是的,我知道我会丢失数据,我接受这个后果。”因此,除非他们需要,否则开发人员应该避免强制转换,因为编译器会保护你免于意外做出愚蠢的事情。
      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多