2013-07-26 4 views
0

Почему выражение (-1 >>> 32) в Java оценивается как -1 вместо 0 как и ожидалось? Оператор >>> -shift должен заполнить предварительные 0 с, поэтому результат должен иметь все биты, установленные на 0.(-1 >>> 32) == -1?

Это странно, потому что это нарушает семантику >>>: например. (-1 >>> x) имеет первые x бит, равные 0 для всех 0 <= x <= 31. Единственным (неожиданным) исключением является 32.

Является ли это преднамеренное поведение, ошибка или оптимизация компилятора?

Я использовал выражение ~(-1 >>> x) для расширения маски cidr-netmask до 32-битного эквивалента, но, как кажется,/32-маски необходимо обрабатывать отдельно.

ответ

1

Проверка this post.

Цитата ответа автора Rasmus Faber

Из спецификации языка Java:

Если расширенный тип левого операнда INT, только пять битов низшего порядка из правый операнд используется в качестве сдвига . Это похоже на то, что правый операнд был подчинен побитовому логическому оператору И & (§15.22.1) с значением маски 0x1f. Фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 31 включительно.

Длинные короче: из-за границы диапазона операндов, -1 >>> 32 эквивалентно -1 >>> 0, который -1.

+0

thx для вашего ответа и извините за отправку повторяющихся вопросов. это объясняет это хорошо. – paranoid

Смежные вопросы