Законно ли для static_assert, что подписанное смещение вправо имеет поведение с двумя дополнительными компонентами?

Законно ли делать следующее в C11, C ++ 11 и C ++ 14?

static_assert(((-4) >> 1) == -2, "my code assumes sign-extending right shift");

или эквивалент C:

_Static_assert(((-4) >> 1) == -2, "my code assumes sign-extending right shift");

Я не знаю правил для константных выражений относительно того, можно ли использовать операции, определенные реализацией, как указано выше.

Мне известно, что противоположный сдвиг со знаком слева от отрицательных чисел не определен независимо от типа машины.

3

Решение

Да. Стандарт C ++ 11 говорит в [expr.shift] / 3:

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

И нигде в [expr.const] / 2 не говорится, что такой сдвиг или выражения со значениями, определяемыми реализацией в целом, не являются константными выражениями.
Таким образом, вы получите постоянное выражение, которое имеет значение, определенное реализацией.

6

Другие решения

Это законно, поскольку это не вызывает неопределенного поведения.

Поведение сдвига вправо отрицательных значений от реализации. Стандарты C и C ++ не гарантируют, что они будут арифметическими или логическими; хотя, насколько я знаю, никогда не было процессора, который бы не выбирал ни того, ни другого.

3

По вопросам рекламы [email protected]