在Java中,当我们声明
short number=1024*1024*1024;
它会在编译时出现错误,但是
short number=1024 * 1024 * 1024 * 1024;
编译正常。这是为什么?
在Java中,当我们声明
short number=1024*1024*1024;
它会在编译时出现错误,但是
short number=1024 * 1024 * 1024 * 1024;
编译正常。这是为什么?
在这种情况下,编译器会计算计算式(因为它只包含常量)并尝试将结果赋值给变量。这个计算是用类型 int
进行的,并且仅在可能的情况下才在赋值时转换为 short
。
对于您的情况,第一个计算结果太大而无法适应 short
(1073741824
)。第二个计算会导致 int
溢出并最终处于 short
支持的范围内(0
)。因此,在这种情况下可以进行赋值操作。
请注意,您可能永远不想在代码中依赖这些东西。
1024L
来验证这一点,这样计算就会以long
形式进行,而不会发生溢出,这将再次导致编译错误。 - Chris Hayes编辑:将有符号整数缩小转换为整数类型T仅保留n个最低位比特,其中n是用于表示类型T的位数。
来自JLS §3.10.1(在this类似的问题中非常正确地提到)
如果int类型的十进制字面量大于2147483648(2的31次方),或者十进制字面量2147483648出现在除一元减运算符(§15.15.4)之外的任何地方,则会在编译时出现错误。