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

问题:

int的限制为-2147483648至2147483647。
如果我输入

int i = 2147483648;

那么Eclipse将在“2147483648”下提示一个红色的下划线。
但是如果我这样做:

int i = 1024 * 1024 * 1024 * 1024;

它会编译好的。

public class Test {
    public static void main(String[] args) {        

        int i = 2147483648;                   // error
        int j = 1024 * 1024 * 1024 * 1024;    // no error

    }
}

也许这是Java中的一个基本问题,但我不知道为什么第二个变体不会产生错误。

回答:

这句话没有错;你只是将4个数字相乘并将其分配给一个int,恰好是一个溢出。这不同于分配单个literal,这将在编译时进行边界检查。
导致错误的超出范围literal,而不是assignment

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

相反,long字面值可以编译好:

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

注意,事实上,is结果仍然是在编译时计算的,因为1024 * 1024 * 1024 * 1024constant expression

int i = 1024 * 1024 * 1024 * 1024;

变为:

   0: iconst_0      
   1: istore_1      

请注意,结果(0)被简单地加载和存储,并且不会发生乘法。
JLS §3.10.1(感谢@ChrisK在评论中提出):

 如果是类型的十进制文字,则是编译时错误

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why does int i = 1024 * 1024 * 1024 * 1024 compile without error?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

69 − 64 =