Каково значение сдвига числа слева на -1

Каков результат числа, когда он сдвинут влево на -1 в программировании на C с помощью оператора сдвига влево?

например:

23 << -1

Ответ 1

Из стандарта C11 6.5.7p3 (для прежних версий это в основном то же самое):

"Если значение правого операнда отрицательное или больше или равно ширине продвинутого левого операнда, поведение undefined."

IOW: undefined поведение. Подготовьтесь к носовые демоны.

Вкратце: Не

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

Ответ 2

Как сказал Олаф в своем ответе, смещение слева отрицательным числом undefined.

Фактически gcc выдаст предупреждение, если вы попытаетесь сдвинуть в любом направлении отрицательное число.

Ответ 3

Побитовый оператор сдвига влево в C:

  • Бит. Структура данных может быть сдвинута на указанное количество позиций налево.
  • Когда данные сдвинуты влево, конечные нули заполняются нулем.
  • Оператор с левой стороны - двоичный оператор [Bi - two]
  • Двоичные средства, Оператор, для которого требуются два аргумента!

Table

Синтаксис:

**[variable]<<[number of places]**

Если число мест станет отрицательным, оно будет undefined