Java primitive Integer.MAX_值溢出

Java primitive Integer.MAX_值溢出,java,Java,我是Java新手,偶然发现了这样一个问题: 如果变量是整数.MAX_值,会发生什么情况 System.out.println(2 * a); System.out.println(4 * a); 两者都给出相应的-2和-4结果。有人能解释一下为什么会这样吗?我读过primitiveint类型重载,但仍然不明白为什么会得到这些结果?在二进制中,Integer.MAX\u值是 Integer.MAX_VALUE = 0111 1111 1111 1111 1111 1111 1111 1111

我是Java新手,偶然发现了这样一个问题: 如果变量是
整数.MAX_值
,会发生什么情况

System.out.println(2 * a);
System.out.println(4 * a);

两者都给出相应的
-2
-4
结果。有人能解释一下为什么会这样吗?我读过primitive
int
类型重载,但仍然不明白为什么会得到这些结果?

在二进制中,Integer.MAX\u值是

Integer.MAX_VALUE = 0111 1111 1111 1111 1111 1111 1111 1111
如果将该数字乘以2,结果与将所有位左移1,右加0相同:

2*Integer.MAX_VALUE = 1111 1111 1111 1111 1111 1111 1111 1110
如果现在在二进制中添加2或
10
,会发生什么情况?多亏了溢出,所有的位都被抵消了,你得到了

2 + 2*Integer.MAX_VALUE = 0
或者换句话说

2*Integer.MAX_VALUE = -2
还有另一种方式可以看到这一点。在二进制中,-1表示所有的1:

-1 = 1111 1111 1111 1111 1111 1111 1111 1111.
所以当你用-1乘以2,你会得到:

2*(-1) = 1111 1111 1111 1111 1111 1111 1111 1110

再次看到2*Integer.MAX_VALUE=-2

在线上有大量关于这方面的信息。这里有一个例子;在integer.MAX_值加1或减1的情况下,我理解整数环绕的概念。但为什么当我乘法时,它会给出一个相反的整数呢?在JAVA中,当MAX_值相乘时,这是默认行为吗?