40

我正在研究 OpenJDK 的源代码。

我的注意力被这些方法所吸引,Byte.compare()并且Integer.compare()

public static int Byte.compare(byte x, byte y) {
    return x-y;
}

public static int Integer.compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

为什么这些方法Byte.compare()Integer.compare()有不同的实现?

4

2 回答 2

50

的实现Integer.compare不使用减法,因为如果您将一个接近的整数Integer.MIN_VALUE与另一个接近的整数进行比较,这可能会导致溢出Integer.MAX_VALUE

在 的情况下不会发生这种溢出Byte.compare,因为在计算之前字节值已隐式转换为整数x-y

(另请参阅:Java 语言规范 - 5.6.2 二进制数字提升

于 2013-11-12T08:20:39.677 回答
8

Byte 方法可以这样实现,因为减法的结果可以用int. 在另一种情况下并非如此。例如:

0 - 0x80000000 == 0x80000000

这是负数,因此比较会错误地表明 0 小于 -2^31

于 2013-11-12T08:23:27.463 回答