为什么 Byte.compare() 和 Integer.compare() 的实现方式不同?

2022-09-01 03:11:10

我正在研究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()


答案 1

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

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

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


答案 2

Byte 方法可以通过这种方式实现,因为减法的结果可以在 中表示。在另一种情况下,情况并非如此。例如:int

0 - 0x80000000 == 0x80000000

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


推荐