在Java中我们宣布
short number=1024*1024*1024;
它会产生编译时错误,但
short number=1024 * 1024 * 1024 * 1024;
编译好。为什么会这样?
答案 0 :(得分:72)
在这种情况下,编译器将评估计算(因为它只包含常量)并尝试将结果分配给变量。此计算使用int
类型完成,并且仅在分配时转换为short
,如果可能的话。
在您的情况下,第一次计算太大而无法放入short
(1073741824
)。第二个将溢出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)。