4

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

4

3 回答 3

6

恕我直言,措辞不佳。它试图在这个表达式中告诉我们什么:

-2147483648

减号不是整数文字的一部分,而是减号是一元减号运算符并且2147483648int文字,并且整数文字2147483648可能只出现在这个确切的表达式中。

于 2013-05-04T02:18:45.263 回答
5

JLS错了吗?

不,JLS 是特定的 - 区分 int 变量和“int 文字”,即 int 类型的十进制文字。

int 变量的范围是 -2,147,483,648..2,147,483,647(即 -(2^31)..2^31-1)

编译器将在Java代码中解析并在上下文中使用的最大十进制字面int量是2,147,483,648,但它只能用作一元'-'运算符的操作数,也就是说,你只能以一种方式使用它- 构造一个 int 可以容纳的最负十进制值:-22147483648.

在您提到的 JLS 的那部分,第 3.10.1 节 Integer Literals中,它说:

int 类型的最大十进制文字是 2147483648 (2^31)。

后面几行也说:

如果 int 类型的十进制文字大于 2147483648 (2^31),或者如果十进制文字 2147483648 出现在除一元减号运算符的操作数之外的任何位置,则会出现编译时错误。

于 2013-05-04T02:22:52.840 回答
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 节),则会出现编译时错误。

于 2013-05-04T02:15:02.357 回答