基元数据类型在Java中溢出

时间:2014-10-14 20:53:42

标签: java

int num=Integer.MAX_VALUE*Integer.MAX_VALUE;

为什么这一行没有给出Java中不兼容的错误,因为结果超出了int的限制?

有人可以详细说明吗?

2 个答案:

答案 0 :(得分:0)

乘法运算符*允许这样做。 Section 15.17.1 of the JLS州:

  

如果整数乘法溢出,则结果是数学乘积的低阶位,如某些足够大的二进制补码格式所示。因此,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同。

简而言之,对于int值,允许溢出并且不是错误。但是,某些IDE可能会将此行标记为警告(IntelliJ似乎警告此情况)。但这会编译,当我打印出num时,我得到1,这是溢出的结果。

在数学上,将 x 定义为Integer.MAX_VALUE + 1或2 31 。然后num是(x-1) 2 ,或(x 2 -2x + 1)。在Java中,当发生这种溢出时,就好像取得了结果(mod 2 32 ),其结果为1。

答案 1 :(得分:0)

Java语言规范为溢出数据类型的计算提供了精确的含义:例如,对int的任何操作都使用结果的32个最低有效位。没有歧义,也没有理由抛出异常。