Java Primitives范围计算

Jek*_*iya 62 java integer-arithmetic

在我们声明的Java中

short number=1024*1024*1024; 
Run Code Online (Sandbox Code Playgroud)

它会给出编译时错误但是

short number=1024 * 1024 * 1024 * 1024;
Run Code Online (Sandbox Code Playgroud)

编译好.为什么会这样?

Joe*_*oey 72

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

在您的情况下,第一个计算太大而不适合short(1073741824).第二个将溢出int并最终在short支持(0)的范围内.所以在这种情况下作业是有效的.

请注意,您可能不希望在代码中依赖这些东西.

  • 我们也可以通过将它们中的一个更改为"1024L"来看到这一点,在这种情况下,计算以"long"完成,并且不会发生溢出,从而再次导致编译错误. (10认同)

Rah*_*thi 11

你正面临这个问题,因为你的数字正在四处徘徊.在第一种情况下,它没有环绕,因此它溢出了短路的范围.但在第二种情况下,它在计算之后回绕,因此它在短的范围内,因此您没有编译时错误.

精度损失意味着您丢失了给定值的信息.(短数据类型是16位带符号的二进制补码整数.它的最小值为-32,768,最大值为32,767(含).)你的第一个案例是短线的范围(1073741824),因此你正在丢失这些信息.

将有符号整数缩小到整数类型T只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数.

编辑:-

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

它是一个编译时间错误,如果文字int类型的小数大于2147483648(2 31),或者如果十进制字面2147483648似乎比作为元负运算的操作数的任何地方的其他(§15.15.4).