那句话没有错。您只是将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节),则这是编译时错误。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)