System.out.println(4 * 2147483647)在java中如何等于-4?

我是一名Java初学者,对此非常困惑。

System.out.println(4*2147483647)在java中如何等于-4?

这是由于整数静默溢出。

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定义 :

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

它与处理器执行二进制多重复制的方式有关。 你在那里的数字是最大有符号整数,表示为0111111111111111111111111 (我没有检查那里的数量,但我想你明白了)。

当你多了4时,就像左移2,结果是11111111111111111111100 (代表-4)。 您可能想要了解如何在二进制文件中完成多重复制 。

因为结果超出了int的范围。 原始数据类型

要解决此问题,请使用long而不是int

问题是你使用int(4个字节)而不是长(8个字节)

 System.out.println(4*2147483647); 

尝试在其中一个数字之后添加l(对于lema),以便结果为long而不是Integer。 Integer的最大值小于您的结果http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html#MAX_VALUE

 System.out.println(4l * 2147483647); 

要么

 System.out.println(4 * 2147483647l); 

以上两个给出了正确的结果。 那是8589934588

计算机系统中大多数整数基于32位,即4字节(也可以使用64位或更多)。 32位整数中最多可以有4,294,967,295。 所以4,294,967,295 + 5会导致溢出给你5.同样-1表示4,294,967,295整数。 因为有一个负面的位。

更多信息: http //en.wikipedia.org/wiki/Integer_overflow

http://en.wikipedia.org/wiki/Integer_(computer_science

这是因为计算机将数字存储在内存中。 2147483647 * 4 = 8589934588

二进制中的8589934588结果为1 1111 1111 1111 1111 1111 1111 1111 1100

第一个是表示其前面的数字为负数的位。

下一部分可以用两个补码来解释。

二进制补码是一种表示负值的方法,通过将所有位置入,然后加1来计算负值。 这将导致0011(最后4个字节的反转)然后添加一个使它成为0100,这是4的二进制表示。

由于符号位为负,因此结果为-4