Формулировка C ++ 17 для подписанных левых сдвигов (E1 << E2
) была:
В противном случае, если E1 имеет тип со знаком и неотрицательное значение, а E1 × 2 E2 представимо в соответствующем типе без знака типа результата, то это значение, преобразованное в тип результата, полученное значение; в противном случае поведение не определено.
Формулировка C ++ 20 для целых чисел со знаком и без знака:
Значение E1 << E2 - это уникальное значение, соответствующее E1 × 2 <sup>E2 по модулю 2 N , где N - показатель диапазона типа результата.
Это приводит, по сути, к одному и тому же; разница в том, что теперь он работает, если E1 отрицателен. «Показатель диапазона» - это, в основном, число битов в типе (показатель диапазона для 16-разрядного целого числа со знаком равен 16).
Сдвиг влево не сдвинулся в знаковый бит, и все еще не сдвинулся.