3

这些值如何在 java 中相同?

-Integer.MIN_VALUE == Integer.MIN_VALUE

值为:

-2147483648 : -2147483648

我尝试比较它并返回 true [太棒了!]

4

3 回答 3

7

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

JLS 第 15.15.4 节(强调我的):

对于整数值,求反与从零减法相同。Java 编程语言对整数使用二进制补码表示,二进制补码值的范围不是对称的,因此对最大负数int或取反会long产生相同的最大负数。这种情况下会发生溢出,但不会抛出异常。对于所有整数值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));
}
于 2013-06-29T09:46:44.993 回答
6

看下面的代码:

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

integer 的最小值是-2147483648,当你对此取反时,它变成 2147483648,比 大1Integer.MAX_VALUE,所以它超出范围,向另一端移动,变成 -2147483648

于 2013-06-29T09:46:00.300 回答
0

Java 使用二进制补码算法,这意味着取反一个值与翻转它的位并加 1 相同。

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

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

于 2013-06-29T09:50:31.537 回答