Java基元的范围计算
在Java中,当我们声明
short number=1024*1024*1024;
它会给编译时间错误,但
short number=1024 * 1024 * 1024 * 1024;
编译好。 为什么会这样呢?
在这种情况下,编译器将评估计算(因为它只包含常量)并尝试将结果分配给variables。 这个计算是用int
types完成的,只有在可能的情况下才转换为short
赋值。
在你的情况下,第一次计算太大,不适合做short
( 1073741824
)。 第二个将溢出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节 )的操作数以外的任何地方,则是编译时错误。