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_VALUEInteger.MAX_VALUE

が計算Byte.compareされる前にバイト値が暗黙的に整数に変換されるため、このオーバーフローは の場合には発生しません。x-y

(参照: Java 言語仕様 - 5.6.2 Binary Numeric Promotion )

于 2013-11-12T08:20:39.677 に答える
8

減算の結果は で表現できるため、Byte メソッドはこの方法で実装できますint。他の場合はそうではありません。例えば:

0 - 0x80000000 == 0x80000000

これは負であるため、0 が -2^31 より小さいと誤って比較されます。

于 2013-11-12T08:23:27.463 に答える