在Java中,对一个值取反后等于这个值本身 [Integer.Min_Value]。

3
这些值在Java中如何相同?
-Integer.MIN_VALUE == Integer.MIN_VALUE

数值为:

-2147483648 : -2147483648

我尝试进行比较,结果为真 [好棒!]

请查看二进制补码 - keyser
它和 0.0/0.0 != 0.0/0.0 一样神奇。 - johnchen902
@johnchen902。因为 NaN != NaN - Rohit Jain
@RohitJain 我知道。但这太棒了。 - johnchen902
@johnchen902。这有什么让人惊讶的吗?你可以从许多其他操作中获得输出 NaN,比如 - Math.sqrt(-1)。因此,两个 NaN 肯定不相等。 - Rohit Jain
@RohitJain 因为 x != x 可能返回 true - johnchen902
3个回答

7

是的,这是预期的行为。 int 的范围是 -2147483648 到 +2147483647。

来自JLS第15.15.4节(重点在我这里):

对于整数值,否定与从零减法相同。 Java编程语言使用补码表示整数,补码值的范围不对称,因此否定最大负 intlong 会导致相同的最大负数。在这种情况下会发生溢出,但不会抛出异常。对于所有整数值 x-x 等于 (~x)+1

~Integer.MIN_VALUEInteger.MAX_VALUE... 当你加一时,它会溢出到 Integer.MIN_VALUE

这就是为什么当你实现一个反向比较器时,你不能这样做的原因:

// BAD CODE!
public int compare(T x, T y) {
    return -originalComparator.compare(x, y);
}

相反,使用这个:

// This is fine, assuming the comparator obeys its contract
public int compare(T x, T y) {
    return originalComparator.compare(y, x));
}

6

看下面的代码:

System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(-Integer.MIN_VALUE);

整数的最小值为-2147483648,当你对其取反时,得到的结果是2147483648,比Integer.MAX_VALUE1,因此超出了范围,然后沿着另一端移动,并变成了-2147483648


0

Java使用二进制补码算术,这意味着取反一个值等同于翻转其位并加1。

但是对于具有位模式100..00的数字呢?当你翻转它的位时,你得到011..11,当你加1时,你得到100..00,与你开始的相同的数字!

由于一系列其他原因,这个数字是可以表示的最小整数,即Integer.MIN_VALUE。


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