为什么我可以生成超出最大值的字符?
为什么以下代码不生成错误?
System.out.println((char) 2147483647);
根据 oracle 数据类型,a 的最大大小为 。char
65,535
- char:char 数据类型是单个 16 位 Unicode 字符。它的最小值为“\u0000”(或 0),最大值为“\uffff”(或 65,535(包括 65,535)。
为什么以下代码不生成错误?
System.out.println((char) 2147483647);
根据 oracle 数据类型,a 的最大大小为 。char
65,535
- char:char 数据类型是单个 16 位 Unicode 字符。它的最小值为“\u0000”(或 0),最大值为“\uffff”(或 65,535(包括 65,535)。
为什么我可以生成超出最大值的字符?
2147483647
不是一个,而是一个 .char
int
您没有将无效值分配给 ,而是将有效值强制转换为,然后应用缩小原始转换规则的范围。请参阅 Java 规范:§5.1.3。char
int
char
简而言之,您保留原始整数的最低16位(“将有符号整数缩小到整数类型T的转换只是丢弃除n个最低阶位之外的所有位,其中n是用于表示类型T的位数。
为什么以下代码不生成错误?
因为它不是错误,而是一个定义明确的行为。
您可以执行从 到 的缩小转换范围,这是允许的,请参阅 java 规范:5.1.3。缩小基元转换:int
char
将有符号整数缩小到整数类型的转换只会丢弃除 n 个最低阶位之外的所有位,其中 n 是用于表示类型的位数。除了可能丢失有关数值大小的信息外,这还可能导致结果值的符号与输入值的符号不同。
T
T
结果不大于 Character.MAX_VALUE
。编译器转换为char
(char) 2147483647
65535