Переход от целых чисел без знака к целым числам без знака и наоборот в C ++ 20 - PullRequest
0 голосов
/ 01 марта 2019

До C ++ 20 целых чисел со знаком не гарантировалось как дополнение к двум.Теперь у нас есть две статьи, предлагающие стандартизацию дополнения до двух в качестве единственного представления: p0907 и p1236 , и, если я правильно понимаю, одна из них была объединена в рабочий проект C ++ 20.

Итак, что это значит для преобразования со знаком в без знака и наоборот?Я посмотрел на cppreference и нашел следующую формулировку:

Если тип назначения не имеет знака, полученное значение является наименьшим значением без знака, равным исходному значению по модулю 2<sup>n</sup>, где n - количество битов, используемых для представления типа назначения.

Если тип назначения подписан, значение не изменяется, если исходное целое число может быть представлено в типе назначения.В противном случае результатом является уникальное значение типа назначения, равное исходному значению по модулю 2<sup>n</sup>, где n - это количество битов, используемых для представления типа назначения.(Обратите внимание, что это отличается от целочисленного арифметического переполнения со знаком, которое не определено).

К сожалению, у меня проблемы с пониманием этой формулировки, и я хочу знать, что написано в C ++ 20 Working Draft.

Итак, есть два вопроса:

  1. Часть юриста по языку: кто-то может указать, что конкретно говорится в стандарте и где в стандарте это сказано?

  2. Может кто-нибудь объяснить эту формулировку более понятными словами, возможно, также объясняя модульную арифметику и предоставив примеры?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Ваша цитата использует много слов, чтобы сказать что-то довольно простое: для каждого целого числа i есть ровно одно целое число k между 0 и M, так что i % M == k (в математическом смыслене смысл "представления целочисленного размера фиксированного размера").В более непрофессиональных терминах i % M == k означает «если я добавлю или вычту M правильное количество раз из i, я могу получить k».

В случае интегральных преобразований M = 2^N где N - количество бит в типе назначения.Стандарт гласит:

[conv.integral] # 3

В противном случае результатом является уникальное значение типа назначения, совпадающее с источникомцелое число по модулю 2^N, где N - показатель диапазона типа назначения.

В примерах:

Скажем, ваш тип назначения имеет 4 бита, поэтому он может представлять2^4 = 16 значения от 0 до 15.Преобразование 1 в этот диапазон дает 1, 14 доходность 14, 15 доходность 15, 16 доходность 0, 17 доходность 1, 18 доходность 2 и так далее.Преобразование 0 выходов 0, -1 выходов 15, -2 выходов 14 и т. Д.

Если вы действительно хотите более глубокое введение в модульную арифметику, это выходит за рамки этогосайт.Вы должны обратиться к многочисленным ресурсам в сети, таким как этот .

0 голосов
/ 01 марта 2019

Правило преобразования: [conv.integral] / 3 :

В противном случае результатом является уникальное значение типа назначения, совпадающее с целым числом источника по модулю2<sup>N</sup>, где N - показатель диапазона типа назначения.

, где показатели диапазона описаны в таблице в [basic.fundamental] , но означают, чтовы ожидаете (для int это как минимум 16, для long long, это как минимум 64 и т. д.).

Например, преобразование short со значением -3 в unsigned shortчтобы найти уникальное значение типа unsigned short, которое соответствует -3 по модулю 2<sup>16</sup> ... то есть 2<sup>16</sup>-3 или 65533.Но преобразование того же short значения -3 в unsigned long long изменит основание по модулю на 2<sup>64</sup>, так что вместо этого вы получите 18446744073709551613.

Преобразование из подписанного типа в подписанныйтип с другим показателем диапазона (или от беззнакового до беззнакового) является более простым - вы либо просто обрезаете биты, либо расширяете их нулями.Преобразование short со значением 258 в int или long или long long составляет всего 258, но, например, signed char - это 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...