Определен ли ›› ((размер a) * CHAR_BIT), UB или IDB?

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

EDIT вопрос изменен


person phoxis    schedule 07.09.2011    source источник


Ответы (1)


1.

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

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

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

2.

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

Результат E1 << E2 - E1 сдвинутые влево 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 подписан и отрицателен.

person Oliver Charlesworth    schedule 07.09.2011
comment
можете пролить свет на вопрос 2? - person phoxis; 07.09.2011
comment
@Oil Charlesworth: отлично. Я должен сохранить копию стандарта, он так четко написан. Большое спасибо за ответы. - person phoxis; 07.09.2011
comment
@phoxis: Честно говоря, это не всегда так ясно и ясно! - person Oliver Charlesworth; 07.09.2011
comment
Самая четкая копия стандарта (преобразованная в HTML): port70.net/~nsz/c /c99/n1256.html - person R.. GitHub STOP HELPING ICE; 07.09.2011