为什么会这样
int a = 2147483648;
导致此错误:
Test.java:3: integer number too large: 2147483648 int a = 2147483648; ^ 1 error
但这没有编译错误吗?
int a = Integer.MAX_VALUE + 1;
答案 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
)。