Java 原始类型 Integer.MAX_VALUE 溢出

huangapple go评论72阅读模式
英文:

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

huangapple
  • 本文由 发表于 2020年8月27日 00:49:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/63602201.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定