Определено ли >> ((sizeof a) * CHAR_BIT), UB или IDB? - PullRequest
4 голосов
/ 07 сентября 2011

1.Рассмотрим следующее:

unsigned int a, b;

b = a >> ((sizeof a) * CHAR_BIT);

/* or 2nd operand greater than ((sizeof a) * CHAR_BIT) */

Это определенное, неопределенное поведение или поведение, зависящее от реализации?

2.Также еще один подвопрос:

В случае a равен signed int, и он смещен меньше своей длины в битах, является ли реализация со сдвигом битов со знаком определенным или неопределенным поведением.В обоих случаях:

  1. При перемещении вправо: a >> 5
  2. При перемещении влево: a << 5

РЕДАКТИРОВАТЬ вопрос отредактирован

1 Ответ

7 голосов
/ 07 сентября 2011

1.

Из стандарта C99, раздел 6.5.7:

Целочисленные преобразования выполняются для каждого из операндов.Тип результата - тип повышенного левого операнда. Если значение правого операнда отрицательно или больше или равно ширине повышенного левого операнда, поведение не определено .

Так что это не определено.

2.

Из того же раздела:

Результат E1 << E2 равен E1 left-смещенные E2 битовые позиции;освобожденные биты заполнены нулями.Если E1 имеет тип без знака, значение результата будет E1 x 2 E2, уменьшено по модулю на единицу больше, чем максимальное значение, представляемое в типе результата. Если E1 имеет тип со знаком и неотрицательное значение, а E1 x 2 E2 представимо в типе результата, то это результирующее значение;в противном случае поведение не определено.

Результат E1 >> E2 равен E1 смещенным вправо E2 позициям битов.Если E1 имеет тип без знака или , если E1 имеет тип со знаком и неотрицательное значение, значение результата является неотъемлемой частью отношения E1 / 2 E2. Если E1 имеет тип со знаком и отрицательное значение, результирующее значение будет определено реализацией .

Так что для левого сдвига это хорошо-определено, если a подписано и положительно.Он не определен, если a подписан и отрицателен.

Для сдвига вправо, он четко определен, если a подписан и положителен.Это определяется реализацией, если a подписано и отрицательно.

...