根据JLS§3.10.1
int类型的最大十进制字面值为2147483648。
由于Integer.MAX_VALUE
是2147483647
,这个命题是否为真?
请注意上面语句的重点是"int"。如果认为它是在"decimal literal"上下文中讨论的,那么甚至2147483649
等也应该是正确的。
所以,如果某个东西是int
类型,那么它的最大值必须是2147483647
。
是我说错了吗?还是说那句话应该更新?
请注意,没有负整数字量,Integer.MIN_VALUE
为−2147483648。因此,-2147483648
被解析为"应用一元减号到2147483648"。如果2147483648不是一个有效的十进制int
字面值,或者你不能在你的程序中直接使用Integer.MIN_VALUE
的int
字面值,那将是非常糟糕的。
旁注: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之间的值。幸运的是,编译器不接受超出该范围的整数字面值。