Сомнения в поведении, сдвигающем биты - PullRequest
1 голос
/ 25 мая 2019

Я хотел бы прояснить некоторые сомнения по поводу сдвига битов:

  1. Использование unsigned int:

    unsigned int i = 500;
    i << 24;

    Насколько я знаю, это вызывает переполнение unsigned int, это прекрасно?

C ++ 17 (8.5.7 / 2) - значение E1 << E2 - это биты E2, сдвинутые влево на E1; освобождено биты заполнены нулями. Если E1 имеет тип без знака, значение результат E1 × 2 ^ E2, уменьшенный по модулю на единицу больше, чем максимальное значение представимые в типе результата. </p>

  1. Использует сдвиг вправо на signed int совершенно нормально, пока я сдвигаюсь меньше, чем '32 бита', потому что 'int' на моей платформе 32 бита.

    int i = 500;
    i >> 31;

Это переполнение?

C ++ 17 (8.5.7 / 3) Значение E1 >> E2 - это биты E2, сдвинутые вправо E1. Если E1 имеет тип без знака или если E1 имеет тип со знаком и неотрицательное значение, значение результата является неотъемлемой частью отношения E1 / 2 ^ Е2.

1 Ответ

3 голосов
/ 25 мая 2019
  1. это прекрасно?

    Да. i станет 4093640704, в шестнадцатеричном 0xf4000000.

  2. Это переполнение?

    Нет. Это сдвиг вправо (операция, подобная делению), поэтому i станет нулем.

Обратите внимание, что правила смены очень вероятно изменятся. В настоящее время в нескольких случаях определены неопределенные поведение или реализация. Поскольку следующий стандарт потребует двух дополнительных арифметики, правила о смещении будут смягчены: единственное неопределенное поведение будет, если величина смещения будет больше или равна ширине типов. Вот текущие проекты правил: ссылка .

...