Страницы

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

суббота, 27 апреля 2019 г.

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

byte b = -1; // b = -1 1111_1111 b <<= 1; // b = -2 1111_1110 b >>>= 1; // b = -1 1111_1111
В комментариях - значение b в debug. В последней строке b должно стать 0111_1111, ведь применялся беззнаковый сдвиг вправо. В чем ошибка?


Ответ

"Ошибка" в спецификации 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);

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

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