整数过大 - 编译错误

时间:2017-03-02 15:57:17

标签: java integer

为什么会这样

int a = 2147483648;

导致此错误:

Test.java:3: integer number too large: 2147483648
int a = 2147483648;
        ^ 1 error

但这没有编译错误吗?

int a = Integer.MAX_VALUE + 1;

3 个答案:

答案 0 :(得分:2)

这是因为添加它时Integer会回绕。

答案 1 :(得分:2)

在主要功能的末尾添加:

System.out.println(a);

您会看到Integer.MAX_VALUE + 1;"翻身"到-2147483648

答案 2 :(得分:0)

分配的目的地是int类型的变量并不重要,因为以下内容同样无效:

long x = 2147483648; // <-- literal yields "integer too large" error

System.out.println(2147483648); // <-- same issue

问题是文字本身,没有L后缀,属于int类型。第一个错误中x的类型无关。

根据JLS 3.10.1关于文字:

  

如果十进制文字2147483648出现在一元减号运算符的操作数之外的任何地方,则是编译时错误;或者如果int类型的十进制文字大于2147483648。

此号码可能无法分配给int,即使文字本身属于规范int类型。但是,如果是Integer.MAX_VALUE + 1,则不违反此规则。 1与[{1}}一样有效int,其总和按15.18.2换算:

  

如果整数加法溢出,则结果是数学和的低阶位,如某些足够大的二进制补码格式所示。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。

请注意,以下内容有效:

Integer.MAX_VALUE

由于int x = (int)2147483648L; 是有效的2147483648L字面值,并且广播会将其截断以适合long,从而产生与int相同的结束值{1}}在这种情况下的结果(特别是MAX_VALUE + 1)。