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

2022-09-03 17:35:43

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

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

根据 oracle 数据类型,a 的最大大小为 。char65,535

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

答案 1

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

2147483647不是一个,而是一个 .charint

您没有将无效值分配给 ,而是将有效值强制转换为,然后应用缩小原始转换规则的范围。请参阅 Java 规范§5.1.3charintchar

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

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

因为它不是错误,而是一个定义明确的行为。


答案 2

您可以执行从 到 的缩小转换范围,这是允许的,请参阅 java 规范:5.1.3。缩小基元转换intchar

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

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


推荐