Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

Почему при беззнаковом сдвиге байта вправо не обнуляется старший разряд?

#java


byte b = -1;   // b = -1  1111_1111
b <<= 1;       // b = -2  1111_1110
b >>>= 1;      // b = -1  1111_1111


В комментариях - значение b в debug.
В последней строке b должно стать 0111_1111, ведь применялся беззнаковый сдвиг вправо.
В чем ошибка?
    


Ответы

Ответ 1



"Ошибка" в спецификации Java. Все операции с целыми числами выполняются с 32-битной точностью, и их результатом является int (кроме случаев, когда один из операндов - long). Код b >>>= 1; эквивалентен b = (byte)( b >>> 1 ); Оператор сдвига выполняет unary numeric promotion для каждого аргумента, приводя их типы к int (или к long). Расширение byte до int сохраняет значение, т.е. (byte)-2 становится (int)-2, отсюда и появляется единица слева в результате сдвига. Для получения нужного результата можно написать так: b = (byte)((b & 0xFF) >>> 1);

Комментариев нет:

Отправить комментарий