JLS 3.10.1. Integer Literals
http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1州
The largest decimal literal of type int is 2147483648.
同时这一行
int x = 2147483648;
产生编译错误
The literal 2147483648 of type int is out of range
JLS错了吗?
答案 0 :(得分:6)
这是措辞不好恕我直言。在这个表达中我们试图说出来的是什么:
-2147483648
减号是不是整数文字的一部分,而减号是一元减号运算符而2147483648
是int
文字和整数文字2147483648
可能只出现在这个确切的表达式中。
答案 1 :(得分:5)
JLS错了吗?
不,JLS是特定的 - 区分int变量和“int literal”,即int类型的十进制文字。
int变量的范围是-2,147,483,648..2,147,483,647(即 - (2 ^ 31).. 2 ^ 31-1)
编译器将在Java代码中解析并在int
上下文中使用的最大十进制文字是2,147,483,648,但它只能用作一元' - '运算符的操作数,也就是说,你只能以一种方式使用它 - 构造一个int可以容纳的最负的十进制值:-22147483648
。
在JLS的那部分中,您提到section 3.10.1 Integer Literals,其中包含:
int类型的最大十进制文字是2147483648(2 ^ 31)。
后面也说了几句话:
如果int类型的十进制文字大于2147483648(2 ^ 31),或者十进制文字2147483648出现在除一元减号运算符的操作数之外的任何地方,则为编译时错误。
答案 2 :(得分:3)
int类型的最大十进制文字是2147483648(231)。
All decimal literals from 0 to 2147483647 may appear anywhere an int literal may appear.
如果int类型的十进制文字大于2147483648(231),或者十进制文字2147483648出现在一元减去运算符(§15.15.4).的操作数之外的任何地方,则是编译时错误