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

Evg*_*eev 4 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.
Run Code Online (Sandbox Code Playgroud)

同时这一行

int x = 2147483648;
Run Code Online (Sandbox Code Playgroud)

产生编译错误

The literal 2147483648 of type int is out of range
Run Code Online (Sandbox Code Playgroud)

JLS错了吗?

Boh*_*ian 6

这是措辞不好的恕我直言.它试图在这个表达式中说我们:

-2147483648
Run Code Online (Sandbox Code Playgroud)

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


Ber*_*t F 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的那一节,3.10.1整数文字中,它说:

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

后面还说了几行:

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