这些值如何在 java 中相同?
-Integer.MIN_VALUE == Integer.MIN_VALUE
值为:
-2147483648 : -2147483648
我尝试比较它并返回 true [太棒了!]
这些值如何在 java 中相同?
-Integer.MIN_VALUE == Integer.MIN_VALUE
值为:
-2147483648 : -2147483648
我尝试比较它并返回 true [太棒了!]
是的,这是预期的行为。的范围int
是 -2147483648 到 +2147483647。
从JLS 第 15.15.4 节(强调我的):
对于整数值,求反与从零减法相同。Java 编程语言对整数使用二进制补码表示,二进制补码值的范围不是对称的,因此对最大负数
int
或取反会long
产生相同的最大负数。这种情况下会发生溢出,但不会抛出异常。对于所有整数值x
,-x
等于(~x)+1
。
~Integer.MIN_VALUE
是Integer.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));
}
看下面的代码:
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
Java 使用二进制补码算法,这意味着取反一个值与翻转它的位并加 1 相同。
但是位模式为 100..00 的数字呢?当你翻转它的位时,你会得到 011..11,当你加 1 时,你会得到 100..00,与你开始时相同的数字!
由于一系列其他原因,这个数字是可以表示的最小整数,即 Integer.MIN_VALUE。