在Java中,负整数相除时出现奇怪的行为

3
尽管我不是java的新手,但前几天我观察到了这种奇怪的行为。我通过运行包含基本算术操作的代码来更新我的基础知识。现在根据Java(当然还有基本算数规则),-ve * -ve-ve / -ve 是一个+ve数字。
但是编译这个源码:
int b = Integer.MIN_VALUE / -1;
System.out.println("b:  " + b);

给我这样的输出:-
b: -2147483648
这是一个负数,有人能指出问题在哪吗?我知道这一定是我注意不到的小事情。

5
-2147483648 / -1 => 2147483648 => 溢出 => -2147483648 - Mateusz Dymczyk
@MateuszDymczyk 这就是答案。 - Maroun
相关链接:https://dev59.com/FWox5IYBdhLWcg3wJxL4 - Maroun
1
有趣的事实:一个好的集成开发环境会告诉你关于溢出的情况(我刚刚检查过)。 - Mateusz Dymczyk
@MateuszDymczyk 谢谢,那很简单 :D ,但我的IDE没有警告。(eclipse kepler sr2) - Mustafa sabir
2个回答

10

除以-1等于取反数。

因为整数范围是从负2147483648到正2147483647,所以在负数方向上的幅度比正数方向大1。-Integer.MIN_VALUE等于Integer.MAX_VALUE+1,这会导致溢出并返回Integer.MIN_VALUE

System.out.println(Integer.MIN_VALUE == -Integer.MIN_VALUE); // prints 'true'

2

您遇到了溢出问题。根据Java规范,溢出时符号不能保证。

溢出是由于以下原因造成的

Integer.MIN_VALUE = -2147483648;
Integer.MAX_VALUE = 2147483647;

所以,-2147483648*(-1)的结果是2147483648,超出了最大值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接