int类型的最大十进制文字是2147483648。
此声明是否可以视为真实,因为Integer.MAX_VALUE
是2147483647
?
请注意,上述声明中的重点是“int”。如果有人认为它是在“十进制文字”的背景下进行讨论,那么即使是2147483649
等等,也应该是真的。
因此,如果某些内容属于int
类型,则其最大值必须为2147483647
。
我是错了还是该声明应该更新?
答案 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。幸运的是,编译器不接受该范围之外的整数文字。