Подтвердить что ты не робот

Почему Byte.compare() и Integer.compare() реализованы по-разному?

Я изучаю источник 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() имеют разные реализации?

4b9b3361

Ответ 1

Реализация Integer.compare не использует вычитание, так как это может привести к переполнению в случае, если вы сравниваете целое число, близкое к Integer.MIN_VALUE, другому, которое близко к Integer.MAX_VALUE.

Это переполнение не может произойти в случае Byte.compare, так как значения байтов неявно преобразуются в целые числа до вычисления x-y.

(см. также: Спецификация языка Java - 5.6.2 Двоичное числовое продвижение)

Ответ 2

Метод байтов может быть реализован таким образом, поскольку результат вычитания представляется в int. Это не так в другом случае. Например:

0 - 0x80000000 == 0x80000000

и это отрицательно, поэтому сравнение ошибочно указывает, что 0 меньше -2 ^ 31