62

在 Java 中,当我们声明

short number=1024*1024*1024; 

它会给出编译时错误,但是

short number=1024 * 1024 * 1024 * 1024;

编译得很好。为什么会这样?

4

2 回答 2

72

在这种情况下,编译器将评估计算(因为它只包含常量)并尝试将结果分配给变量。此计算是使用类型完成的,int并且仅在可能的情况下转换为short赋值。

在您的情况下,第一个计算太大而无法放入short( 1073741824)。第二个将溢出int并最终在short支持 ( 0) 的范围内。因此,在这种情况下,分配有效。

请注意,您可能永远不想在代码中依赖这些东西。

于 2014-07-16T05:41:35.807 回答
11

您正面临问题,因为您的号码正在环绕。在第一种情况下,它不会环绕,因此它超出了 short 的范围。但在第二种情况下,它在计算之后回绕,因此它在短的范围内,所以你没有编译时错误。

精度损失意味着您正在丢失给定值的信息。(短数据类型是一个 16 位有符号二进制补码整数。它的最小值为 -32,768,最大值为 32,767(含)。)在您的第一种情况是跨过空头范围(1073741824),因此您正在丢失信息。

有符号整数到整数类型 T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。

编辑:-

来自JLS §3.10.1 (在这个类似的问题中非常正确地提到)

如果 int 类型的十进制文字大于 2147483648 (2 31 ),或者如果十进制文字 2147483648 出现在除一元减号运算符 ( §15.15.4 ) 的操作数之外的任何位置,则会出现编译时错误。

于 2014-07-16T05:46:56.990 回答