Применение побитовых операторов сдвига к знаковым типам: UB и Impl. определенный - PullRequest
4 голосов
/ 28 июня 2011
Стандарт

C ++ 03 говорит нам, что результатом применения операторов побитового сдвига к знаковым типам может быть UB и Impl. определено для отрицательных значений. Мой вопрос следующий: почему для оператора << он имеет неопределенное поведение , а для оператора >> это просто реализация, определенная ? Есть ли строгая причина, по которой результат << не может быть также определен реализацией?
Заранее спасибо.

1 Ответ

3 голосов
/ 28 июня 2011

Согласно 5.8 / 2 (по общему признанию в C ++ 98, который является всем, к чему я имею доступ):

Значение E1 << E2 равно E1 (интерпретируется как битовый паттерн) сдвинутые влево битовые позиции E2; освобождено биты заполнены нулями. Если E1 имеет тип без знака, значение результата E1 умножается на количество 2 поднял на мощность Е2, уменьшил по модулю ULONG_MAX + 1, если E1 имеет тип unsigned long, UINT_MAX + 1 в противном случае. </p>

Из этого мне кажется, что он отлично определен для левого смещения. Что не определено, так это представление значений со знаком (например, дополнения до двух), поэтому числовое значение результата является реализацией, определенной для отрицательных значений.

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

...