下面是关于Java语言规范的解释。
上整数常量(JLS 3.10.1)的部分这样说:
最大十进制字面int类型是2147483648
(2 )。从0
到2147483647
的所有十进制文字可以出现在可能出现整型文字的任何位置,但文字2147483648
可能仅出现在一元否定运算符-
的操作数中。
所以......
第一条语句是一个合法的整数文字值的分配。没有编译错误。
第二个声明是编译错误,因为2147483648
不在一元否定运算符之前。
第三条语句不包含超出范围的整数字面值,因此从该角度看它不是编译错误。
而是,第三种说法是如JLS 15.18.2中所述的二进制加法表达式。这说明了整数大小写如下:
如果整数加法溢出,那么结果就是以一些足够大的二进制补码格式表示的数学和的低位。如果发生溢出,则结果的符号与两个操作数值的数学和的符号不同。
因此,2147483647 + 1
溢出并包装到-2147483648
。
@Peter Lawrey的建议(轻率?)第三语句可“由编译器重写”为+2147483648
,导致编译错误。
这是不正确的。
JLS中没有任何内容表明常量表达式可以与非常量表达式具有不同的含义。相反,在例如1/0
的情况下,JLS翻转事物并且说该表达式不是一个常量表达式,因为它异常终止。 (它在JLS 15.28)
JLS极力避免某些Java构造意味着不同事情的情况,这取决于编译器。例如,“明确赋值”规则非常特别,以避免只有智能编译器可以推断出该变量在使用之前始终被初始化的情况。从代码可移植性的角度来看,这是一件好事。
编译器实现者为了执行特定于平台的事情而存在“摆动空间”的唯一重要领域是并发性和Java内存模型。有一个合理的实用原因 - 允许多线程Java应用程序在多核/多处理器硬件上快速运行。
对不起,我没有得到你 – satheesh 2011-02-28 09:36:07