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