Я хотел бы развеять некоторые сомнения по поводу битового сдвига:
Использование
unsigned int
:unsigned int i = 500;
i << 24;
Насколько мне известно, это вызывает переполнение
unsigned int
, это нормально?
C ++ 17 (8.5.7 / 2) - Значение E1 ‹---------------- E2 - битовые позиции E2 со смещением влево E1; освобожденные биты заполняются нулями. Если E1 имеет беззнаковый тип, значение результата будет E1 × 2 ^ E2, уменьшенное по модулю на единицу больше, чем максимальное значение, представленное в типе результата.
Использует правый сдвиг на
signed int
отлично, пока я смещаю менее 32 бит, потому что int на моей платформе 32 бита.int i = 500;
i >> 31;
Это переполнение?
C ++ 17 (8.5.7 / 3) Значение E1 >> E2 - это E1, сдвинутые вправо битовые позиции E2. Если E1 имеет беззнаковый тип или если E1 имеет знаковый тип и неотрицательное значение, значение результата является неотъемлемой частью частного E1 / 2 ^ E2.
unsigned
переполнения нет. Когда произойдет переполнение для значенияunsigned
, число уменьшается по модулю на наибольшее значение для типа + 1. Имеетсяsigned
переполнение. - person David C. Rankin   schedule 25.05.2019