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

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()方法有不同的实现方式?


5
@Discipol你的说法是正确的,但在这种情况下并不是那个原因!;) - isnot2bad
嘿,那个整数比较从来没有返回正数,这只是在 + - 1 中的一个笔误吗? - kajacx
3
似乎您复制的代码片段存在错误:应该是 return (x < y) ? -1 : ((x == y) ? 0 : 1); - senseiwu
上面的int compare()实现永远不会返回正值。这正确吗? - Bimalesh Jha
你是对的。我修改了问题。抱歉,我犯了一个错误。 - Sergey Morozov
2个回答

50
Integer.compare的实现不使用减法,因为如果你比较一个接近Integer.MIN_VALUE的整数和另一个接近Integer.MAX_VALUE的整数,这可能会导致溢出。

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

(参见:Java 语言规范 - 5.6.2 二进制数值提升


8

Byte方法可以这样实现,因为减法的结果可以用int表示。但在另一种情况下则不是这样。例如:

0 - 0x80000000 == 0x80000000

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接