2015-07-21 2 views
11

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

например:

23 << -1 
+2

левый сдвиг с -1 выглядит как правый сдвиг с 1 – adricadar

+0

@adricadar: Похож (и я иногда это был), но: Принципиально неправильно. – Olaf

+0

Примечание. Поскольку ОП говорит «число», существует другое ограничение: «Каждый из операндов должен иметь целочисленный тип». – chux

ответ

9

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

«Если значение правого операнда отрицателен или больше или равный ширине продвинутого левого операнда, поведение не определено ».

IOW: undefined behaviour. Подготовьтесь к nasal demons.

Кратко: Не

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

+1

Не '((int) 1 << 31) - 1' также не определено, если' int' имеет 32 бита или меньше? – chux

+0

@chux: Обновлено Спасибо! – Olaf

0

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

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

Table

Синтаксис:

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

Если количество мест становится отрицательным, это будет определено

1

Как сказал Олаф в своем ответе, левый сдвиг отрицательным числом не определено.

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

+3

«... gcc выдаст предупреждение ...»: но только если он сможет определить время компиляции, т. е. если количество сдвигов является постоянным, как в вопрос. – Olaf

Смежные вопросы