Java Primitives范围计算

时间:2014-07-16 05:39:25

标签: java integer-arithmetic

在Java中我们宣布

short number=1024*1024*1024; 

它会产生编译时错误,但

short number=1024 * 1024 * 1024 * 1024;

编译好。为什么会这样?

2 个答案:

答案 0 :(得分:72)

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

在您的情况下,第一次计算太大而无法放入short1073741824)。第二个将溢出int并最终位于short支持的范围内(0)。所以在这种情况下作业就可以了。

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

答案 1 :(得分:11)

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

精度损失意味着您丢失了给定值的信息。(短数据类型是一个16位带符号的二进制补码整数。它的最小值为-32,768,最大值为32,767 (包括)。)在你的第一种情况下,短线的范围被交叉(1073741824),因此你正在丢失信息。

  

将有符号整数缩小转换为整数类型T.   简单地丢弃除n个最低位之外的所有位,其中n是数字   用于表示类型T的位数。

修改: -

来自 JLS §3.10.1 (在this类似问题中非常正确地提及)

  

如果int类型的十进制文字较大,则是编译时错误   比2147483648(2 31 ),或者如果出现十进制文字2147483648   除了作为一元减运算符的操作数之外的任何地方   (§15.15.4)。