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

Ser*_*zov 40 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);
}
Run Code Online (Sandbox Code Playgroud)

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

isn*_*bad 50

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

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

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


Ing*_*ngo 8

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

0 - 0x80000000 == 0x80000000
Run Code Online (Sandbox Code Playgroud)

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