Левое смещение с отрицательным сдвигом
Что именно происходит здесь?
a << -5
Очевидно, что это не так. Но в книге, которую я читаю, говорится:
На одной машине это выражение фактически сдвигает влево 27 бит
Мой вопрос: Зачем? Что вызывает сдвиг влево 27 бит? И что именно происходит при смещении с отрицательным сдвигом? Спасибо.
Ответы
Ответ 1
Отрицательные целые числа в правой части - это поведение undefined на языке C.
ISO 9899: 1999 6.5.7 Операторы битового сдвига §3
Выполняются целые рекламные акции на каждом из операндов. Тип в результате левый операнд. Если значение правый операнд отрицательный или больше или равно ширине продвинутый левый операнд, поведение undefined.
Ответ 2
Как уже было сказано другими членами, он создает поведение undefined. То, что я хотел бы упомянуть здесь, - это то, что вы цитируете из книги ( "На одной машине" ), кажется, частичной. Он не обобщает поведение. Книга также могла бы объяснить, что поведение undefined соответствует стандарту.
Кстати, я просто проходил "Новый стандарт C - экономический и культурный комментарий" и нашел это выражение:
Инструкция Intel Socket Intel Pentium (созданный как gcc, так и Microsoft С++ для оценки сдвигов влево) использует только нижние пять бит сдвига сумма
Это очень хорошо объясняет, почему левый сдвиг -5 может привести к сдвигу влево 27 (для 2 дополнительных представлений отрицательных чисел)
Ответ 3
Поведение undefined.
В 5-битовой двоичной арифметике, two's-complement -5 имеет то же двоичное представление, что и unsigned +27, что, вероятно, объясняет эту конкретную платформу.
Ответ 4
Если значение, которое вы смещаете, представляет собой 32-битную переменную, сдвиг -5 переходит в "цикл" и сдвигает 27 вперед. Смещение может выполняться только "без знака".
Ответ 5
int main()
{
unsigned int a = 1;
printf("%u\n",a<<(-1));
return 0;
}
Выходной сигнал - 2147483648.
Вот мое предположение и подтверждение: (просто предположение!)
1. "< правый операнд должен быть неподписанным типом int,
Итак, во-первых, (int) "-1" будет отлита в (unsigned int) "-1". Дело типа int - это представление с двумя дополнениями, результат будет равен 2 ^ 32-1 (unsigned int)
2.Due to number 2 ^ 32-1 больше, чем цифра максимального смещения, 2 ^ 32 - 1 будет mod 32, что равно 27
I также пробовал некоторые другие правильные номера операндов, а результаты ручного вычисления с допущенными правилами будут одинаковыми с каким продуктом моей IDE.
Я пытаюсь найти некоторые поддерживающие официальные документы, которые могли бы подтвердить, является ли мое предположение правильным или нет. Может быть, вы можете мне сказать.