Java 原语范围计算

2022-08-31 15:54:59

在 Java 中,当我们声明

short number=1024*1024*1024; 

它会给出编译时错误,但

short number=1024 * 1024 * 1024 * 1024;

编译正常。为什么会发生这种情况?


答案 1

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

在您的例子中,第一个计算太大,无法放入 ()。第二个将溢出,并最终到达支持 () 的范围内。因此,在这种情况下,分配是有效的。short1073741824intshort0

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


答案 2

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

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

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

编辑:-

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

如果 int 类型的十进制文本大于 2147483648 (231),或者如果十进制文本2147483648作为一元减号运算符 (§15.15.4) 的操作数出现在其他任何位置,则这是编译时错误。


推荐