英文:
Java primitive Integer.MAX_VALUE overflow
问题
我是Java的新手,在学习过程中遇到了这样一个问题:
如果一个变量是Integer.MAX_VALUE
会发生什么?
System.out.println(2 * a);
System.out.println(4 * a);
这两行分别会得到结果-2
和-4
。有人可以解释一下为什么会这样吗?我读了关于基本类型int
的重载的内容,但仍然不明白为什么会得到这些结果。
英文:
I am a newbee in Java and stumbled upon a such question:
What happens if a variable is Integer.MAX_VALUE
?
System.out.println(2 * a);
System.out.println(4 * a);
Both give -2
and -4
results accordingly. Can someone explain me why this is it? I read about primitive int
type overloading but still don't understand why I got these results?
答案1
得分: 1
在二进制中,Integer.MAX_VALUE 是
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
英文:
In binary, Integer.MAX_VALUE is
Integer.MAX_VALUE = 0111 1111 1111 1111 1111 1111 1111 1111
If you multiply this number by 2, the result is the same as shifting all bits left by 1 and adding a 0 on the right:
2*Integer.MAX_VALUE = 1111 1111 1111 1111 1111 1111 1111 1110
What happens if you now add 2, or 10
in binary? Thanks to overflow, all bits cancel out and you get
2 + 2*Integer.MAX_VALUE = 0
or in other words
2*Integer.MAX_VALUE = -2
There is another way to see this. In binary, -1 is all ones:
-1 = 1111 1111 1111 1111 1111 1111 1111 1111.
So when you multiply -1 by 2 you get:
2*(-1) = 1111 1111 1111 1111 1111 1111 1111 1110
Again you see 2*Integer.MAX_VALUE = -2
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论