为什么JLS声明最大的int literal是2147483648?

时间:2013-05-04 02:08:57

标签: java jls

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错了吗?

3 个答案:

答案 0 :(得分:6)

这是措辞不好恕我直言。在这个表达中我们试图说出来的是什么:

-2147483648

减号是不是整数文字的一部分,而减号是一元减号运算符2147483648int文字和整数文字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).的操作数之外的任何地方,则是编译时错误