Ответ 1
Из стандарта C11 6.5.7p3 (для прежних версий это в основном то же самое):
"Если значение правого операнда отрицательное или больше или равно ширине продвинутого левого операнда, поведение undefined."
IOW: undefined поведение. Подготовьтесь к носовые демоны.
Вкратце: Не
Предостережение:. Многие программисты знают об этом и избегают отрицательных сдвигов, часто игнорируются, что также считается >=
размер бита значения также undefined. Это делает что-то вроде ((unsigned int)1 << 32) - 1
на самом деле undefined, если unsigned int
имеет 32 бита или меньше. Для подписанных значений вещи становятся более сложными из-за знака (спасибо @chux за то, что указали на меня). Это обычная ошибка. Для некоторых реализаций могут возникать разные результаты для постоянных выражений (оценка времени компиляции) и оценка времени выполнения.