无符号整数比较



我假设;compareUnsigned";在下面的示例中将返回0。但它正在回归-1。为什么b被视为大于a?

int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE * -1;
System.out.printf("x compared to y: %d%n", Integer.compare(a, b));
System.out.printf("x compared to y: %d%n", Integer.compareUnsigned(a, b));

compareUnsigned不会做您认为它会做的事情。你可能认为它只比较了自变量的幅度,而没有考虑它们的符号。然而,它真正做的是将两个int视为uint(这在Java中并不存在,这就是为什么存在这个方法!(。

也许文件对此并不清楚,它只是说";将这些值视为无符号"其可以被解释为";忽略符号";,但如果你看看compareUnsigned的实现,你会发现它实际上做了什么:

public static int compareUnsigned(int x, int y) {
return compare(x + MIN_VALUE, y + MIN_VALUE);
}

无论如何,要比较两个uint,我们只需要看看它们的二进制表示。二进制中的MAX_VALUE是31个一(让我们忽略前导零(,而它的否定是1个一后面跟着30个零,后面跟着1个一。

1111111111111111111111111111111 // MAX_VALUE
10000000000000000000000000000001 // -MAX_VALUE

很明显,作为一个无符号二进制数,哪个更大。这显然是一个有更多的数字。


要在不考虑符号的情况下实际比较两个整数,请应用Math.abs,然后进行比较(但对Integer.MIN_VALUE不起作用,您必须单独检查(:

Integer.compare(Math.abs(a), Math.abs(b))

最新更新