Java基元的范围计算

在Java中,当我们声明

short number=1024*1024*1024; 

它会给编译时间错误,但

 short number=1024 * 1024 * 1024 * 1024; 

编译好。 为什么会这样呢?

在这种情况下,编译器将评估计算(因为它只包含常量)并尝试将结果分配给variables。 这个计算是用inttypes完成的,只有在可能的情况下才转换为short赋值。

在你的情况下,第一次计算太大,不适合做short1073741824 )。 第二个将溢出int并在short支持( 0 )的范围内结束。 所以在这种情况下,作业就起作用了

提醒你,你可能不想依靠这些代码。

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

精度的损失意味着你正在丢失给定值的信息( 短数据types是一个16位带符号的二进制补码整数,最小值为-32,768,最大值为32,767(含))。您的第一个案件的短的范围是越过(1073741824),因此你正在失去的信息。

将有符号整数缩小到整数typesT只是简单地丢弃n个最低位的所有位,其中n是用于表示typesT的位数。

编辑:-

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

如果inttypes的十进制文字大于2147483648(2 31 ),或者十进制文字2147483648出现在非一元减运算符(第15.15.4节 )的操作数以外的任何地方,则是编译时错误。