为什么int i = 1024 * 1024 * 1024 * 1024编译时没有错误?

为什么int i = 1024 * 1024 * 1024 * 1024编译时没有错误?,第1张

为什么int i = 1024 * 1024 * 1024 * 1024编译时没有错误

那句话没有错。您只是将4个数字相乘并将其分配给一个int,恰好发生溢出。这与分配单个 文字 不同,后者在编译时会进行边界检查。

导致错误而不是 赋值的 是超出范围的 文字 : __

System.out.println(2147483648);        // errorSystem.out.println(2147483647 + 1);    // no error

相反,

long
文字可以编译良好:

System.out.println(2147483648L);       // no error

请注意,实际上,结果仍然 在编译时计算的,因为它

1024 * 1024 * 1024 * 1024
是一个
常量表达式


int i = 1024 * 1024 * 1024 * 1024;

变成:

   0: iconst_0         1: istore_1

请注意,结果(

0
)只是简单地加载和存储,并且不会发生乘法。


从JLS§3.10.1起(感谢@ChrisK在评论中提出):

如果type的十进制文字

int
大于
2147483648
(2
31),或者十进制文字
2147483648
出现在非一元减运算符的 *** 作数之外的任何地方(第15.15.4节),则这是编译时错误。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5426933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存