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