Подтвердить что ты не робот

Левое смещение с отрицательным сдвигом

Что именно происходит здесь?

a << -5

Очевидно, что это не так. Но в книге, которую я читаю, говорится:

На одной машине это выражение фактически сдвигает влево 27 бит

Мой вопрос: Зачем? Что вызывает сдвиг влево 27 бит? И что именно происходит при смещении с отрицательным сдвигом? Спасибо.

4b9b3361

Ответ 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.

Я пытаюсь найти некоторые поддерживающие официальные документы, которые могли бы подтвердить, является ли мое предположение правильным или нет. Может быть, вы можете мне сказать.