Java原始数据类型范围计算

62

在Java中,当我们声明

short number=1024*1024*1024; 

它会在编译时出现错误,但是

short number=1024 * 1024 * 1024 * 1024;

编译正常。这是为什么?


@Raedwald,Erwin,Ivan,Carlos 我的问题与你提到的问题不同。这里的问题不仅涉及数字的字面和运行时评估,而且涉及到 short 的范围,在上述问题中,即使没有表达式是字面值,第一个表达式也会出错,问题是为什么编译时会发生这样的行为?无论如何,谢谢,现在我对下面的答案感到满意。 - Jekin Kalariya
好问题,我给你点赞 +1。 - Bhargav Modi
2个回答

72

在这种情况下,编译器会计算计算式(因为它只包含常量)并尝试将结果赋值给变量。这个计算是用类型 int 进行的,并且仅在可能的情况下才在赋值时转换为 short

对于您的情况,第一个计算结果太大而无法适应 short1073741824)。第二个计算会导致 int 溢出并最终处于 short 支持的范围内(0)。因此,在这种情况下可以进行赋值操作。

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


10
我们也可以通过将其中一个数字更改为1024L来验证这一点,这样计算就会以long形式进行,而不会发生溢出,这将再次导致编译错误。 - Chris Hayes
1
@user2169777:精度丢失意味着您正在失去给定值的信息。(short数据类型是16位有符号二进制补码整数。它的最小值为-32,768,最大值为32,767(包括边界)。)在您的第一个案例中,short的范围已经超出了(1073741824),因此您正在失去信息。因此,您会收到错误提示。 - user3414693

11
你面临的问题是你的数字 wrapping around 。在第一种情况下,它不会包裹,因此会溢出short的范围。但在第二种情况下,在计算后它会被包裹,并进入short的范围,因此您不会遇到编译时错误。
精度损失意味着您正在失去给定值的信息。 ( short数据类型是16位有符号二进制补码整数。它的最小值为-32768,最大值为32767(包括))。在您的第一种情况下,超过了short的范围(1073741824),因此您正在失去信息。

将有符号整数缩小转换为整数类型T仅保留n个最低位比特,其中n是用于表示类型T的位数。

编辑:

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

如果int类型的十进制字面量大于2147483648(2的31次方),或者十进制字面量2147483648出现在除一元减运算符(§15.15.4)之外的任何地方,则会在编译时出现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接