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

时间:2015-06-12 11:20:06

标签: java char

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

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

根据oracle datatypeschar的最大尺寸为65,535

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

5 个答案:

答案 0 :(得分:26)

  

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

2147483647不是char,而是int

您没有为char分配无效值,而是将有效int转换为char,然后缩小原始转换规则适用。请参阅Java specs§5.1.3

简而言之,保持原始整数的最低16位(“将有符号整数的变窄转换为整数类型T只丢弃除n个最低位之外的所有位,其中n是用于表示的位数输入T。“)。

  

为什么以下代码不会生成错误?

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

答案 1 :(得分:6)

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

  

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

结果char不大于Character.MAX_VALUE。 编译器将(char) 2147483647转换为65535

答案 2 :(得分:3)

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

当你将一个32位整数转换为16位短整数(或者为char)时,你会松开源的高位。

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

答案 3 :(得分:0)

这适用于任何数据类型,它被称为integer overflow,当投射超出您所投射类型大小的任何位时会被截断。

答案 4 :(得分:-1)

实际上,您的问题的答案是您无法

为什么你没有看到任何错误?
由于Character.MAX_VALUE + 1 = Character.MIN_VALUE ...与Integer.MAX_VALUE和其他人相同,JVM将其视为循环以避免此类问题... 但在尝试计算时会产生错误结果< /强> ....

检查this question以获取更多信息和技术信息