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

时间:2013-11-12 08:16:08

标签: java compareto

我正在研究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()有不同的实现?

2 个答案:

答案 0 :(得分:50)

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

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

(另见:Java Language Specification - 5.6.2 Binary Numeric Promotion

答案 1 :(得分:8)

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

0 - 0x80000000 == 0x80000000

并且这是否定的,因此比较将错误地指示0小于-2 ^ 31