int num=Integer.MAX_VALUE*Integer.MAX_VALUE;
为什么这一行没有给出Java中不兼容的错误,因为结果超出了int
的限制?
有人可以详细说明吗?
答案 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个最低有效位。没有歧义,也没有理由抛出异常。