为什么以下代码不会产生错误?
System.out.println((char) 2147483647);
根据oracle datatypes,char
的最大尺寸为65,535
。
- char:char数据类型是单个16位Unicode字符。它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535(含))。
答案 0 :(得分:26)
为什么我可以生成超出最大值的字符?
2147483647
不是char
,而是int
。
您没有为char
分配无效值,而是将有效int
转换为char
,然后缩小原始转换规则适用。请参阅Java specs:§5.1.3。
简而言之,保持原始整数的最低16位(“将有符号整数的变窄转换为整数类型T只丢弃除n个最低位之外的所有位,其中n是用于表示的位数输入T。“)。
为什么以下代码不会生成错误?
因为它不是错误,所以它是一种明确定义的行为。
答案 1 :(得分:6)
您执行从int
到char
的缩小转换,允许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以获取更多信息和技术信息