#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);
Комментариев нет:
Отправить комментарий