int类型的最大十进制字面值为2147483648或2147483647



根据JLS§3.10.1

int类型的最大十进制字面值为2147483648。

由于Integer.MAX_VALUE2147483647,这个命题是否为真?

请注意上面语句的重点是"int"。如果认为它是在"decimal literal"上下文中讨论的,那么甚至2147483649等也应该是正确的。

所以,如果某个东西是int类型,那么它的最大值必须是2147483647

是我说错了吗?还是说那句话应该更新?

请注意,没有负整数字量,Integer.MIN_VALUE为−2147483648。因此,-2147483648被解析为"应用一元减号到2147483648"。如果2147483648不是一个有效的十进制int字面值,或者你不能在你的程序中直接使用Integer.MIN_VALUEint字面值,那将是非常糟糕的。

旁注:JLS 定义什么是正确的。所以根据定义它是正确的。但也有不好的时候

来自同一个JLS部分

十进制字面值2147483648只能作为一元减运算符

的操作数出现

。e

int value = -2147483648;

存在

,

int value = 2147483648;

是编译时错误。

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

注意:Reimeus有上面的正确答案。


是的,你是对的,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之间的值。幸运的是,编译器不接受超出该范围的整数字面值。

最新更新