这是由于整数静默溢出。
2147483647 == Integer.MAX_VALUE是整数的最大值。
无声溢出意味着
2147483647 + 1 == Integer.MIN_VALUE = -2147483648
您可以看到
2147483647 + 2147483647 == 2147483647 + (-2147483648 + - 1) == -2
换句话说,
2147483647 * 2 == -2现在您可以看到原因
2147483647 * 4 == -4。
从技术上讲,结果由Java语言规范#15.17.1定义:
如果整数乘法溢出,则结果是数学乘积的低阶位,以某种足够大的二进制补码格式表示。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学积的符号不同。



