这些值在Java中如何相同?
我尝试进行比较,结果为真 [好棒!]
-Integer.MIN_VALUE == Integer.MIN_VALUE
数值为:
-2147483648 : -2147483648
我尝试进行比较,结果为真 [好棒!]
-Integer.MIN_VALUE == Integer.MIN_VALUE
数值为:
-2147483648 : -2147483648
是的,这是预期的行为。 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);
整数的最小值为-2147483648,当你对其取反时,得到的结果是2147483648,比Integer.MAX_VALUE
大1,因此超出了范围,然后沿着另一端移动,并变成了-2147483648。
Java使用二进制补码算术,这意味着取反一个值等同于翻转其位并加1。
但是对于具有位模式100..00的数字呢?当你翻转它的位时,你得到011..11,当你加1时,你得到100..00,与你开始的相同的数字!
由于一系列其他原因,这个数字是可以表示的最小整数,即Integer.MIN_VALUE。
0.0/0.0 != 0.0/0.0
一样神奇。 - johnchen902NaN != NaN
。 - Rohit JainNaN
,比如 -Math.sqrt(-1)
。因此,两个NaN
肯定不相等。 - Rohit Jainx != x
可能返回true
! - johnchen902