int类型的最大十进制文字是2147483648或2147483647?

时间:2015-10-10 22:25:56

标签: java

根据JLS §3.10.1

  

int类型的最大十进制文字是2147483648。

此声明是否可以视为真实,因为Integer.MAX_VALUE2147483647

请注意,上述声明中的重点是“int”。如果有人认为它是在“十进制文字”的背景下进行讨论,那么即使是2147483649等等,也应该是真的。

因此,如果某些内容属于int类型,则其最大值必须为2147483647

我是错了还是该声明应该更新?

4 个答案:

答案 0 :(得分:3)

请注意,没有负整数文字,Integer.MIN_VALUE是-2147483648。所以-2147483648被解析为“将一元减去应用到2147483648”。如果2147483648不是有效的十进制int字面值,或者您无法在程序中直接使用int字面值Integer.MIN_VALUE,那将是非常糟糕的。

附注:JLS 定义正确的内容。所以它的定义是正确的。但这可能很糟糕。

答案 1 :(得分:2)

来自同一JLS section

  

十进制文字2147483648可能仅作为一元减运算符

的操作数出现

int value = -2147483648;

存在

但是

int value = 2147483648;

是编译时错误。

答案 2 :(得分:1)

每个文字都是特定类型的文字(布尔文字,整数文字,浮点文字等),尽管它可以分配给不同类型的字段/变量。例如,2147483647是有效的整数文字,而2147999999则不是(2147999999L ,尽管它是一个长文字)。虽然写作不清楚,但似乎没有任何矛盾。

答案 3 :(得分:1)

注意:上面的Reimeus has the right answer

是的,你是对的,JLS说

  

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

但是如果你尝试编译

    int j = 2147483648;

你得到了

    Error:(20, 17) java: integer number too large: 2147483648

2 ^ 31等于2147483648,即0x80000000,但在32位二进制补码表示法中,这实际上等于-1。

因此,2 ^ 31不能用int表示。

int只能表示Integer.MIN_VALUE的值,即-2 ^ 31到Integer.MAX_VALUE,即(2 ^ 31)-1。幸运的是,编译器不接受该范围之外的整数文字。