целые числа со знаком теперь ведут себя по-другому, в отношении сдвига влево? - PullRequest
0 голосов
/ 18 января 2019

В c ++ 20 целые числа со знаком теперь определены для использования дополнения до двух,
см. http://www.open -std.org / jtc1 / sc22 / wg21 / docs /apers / 2018 / p0907r3.html

Это долгожданное изменение, однако один из пунктов пули попался на глаза:

Изменение Сдвиг влево на целочисленных типах со знаком выдает то же самое результат в виде сдвига влево на соответствующем целом типе без знака.

Это похоже на странное изменение. Разве это не сместит знаковый бит?

1 Ответ

0 голосов
/ 18 января 2019

Формулировка C ++ 17 для подписанных левых сдвигов (E1 << E2) была:

В противном случае, если E1 имеет тип со знаком и неотрицательное значение, а E1 × 2 E2 представимо в соответствующем типе без знака типа результата, то это значение, преобразованное в тип результата, полученное значение; в противном случае поведение не определено.

Формулировка C ++ 20 для целых чисел со знаком и без знака:

Значение E1 << E2 - это уникальное значение, соответствующее E1 × 2 <sup>E2 по модулю 2 N , где N - показатель диапазона типа результата.

Это приводит, по сути, к одному и тому же; разница в том, что теперь он работает, если E1 отрицателен. «Показатель диапазона» - это, в основном, число битов в типе (показатель диапазона для 16-разрядного целого числа со знаком равен 16).

Сдвиг влево не сдвинулся в знаковый бит, и все еще не сдвинулся.

...