Почему неявные преобразования C работают так же?

Когда целое число выходит за пределы диапазона типа, максимальное значение + 1 добавляется / вычитается (зависит от того, в какой части диапазона было это число). Например,

unsigned short num = 65537;

num будет иметь значение 1 (было вычтено 65536). У меня вопрос: почему это происходит? Моя интуиция подсказывает мне, что это как-то связано с флагом переноса и флагом переполнения, потому что максимальное значение всегда равно 1111 ....

Заранее спасибо!


person Zakum    schedule 15.07.2012    source источник
comment
Прекрасный пример того, почему вы должны компилировать практически все возможные предупреждения. А вот почему это в стандарте .... Понятия не имею: p. (Если вы специально не имеете в виду 1. Это просто переполнение комплиментов на двоих.)   -  person Corbin    schedule 15.07.2012
comment
Пример такого предупреждающего сообщения: warning: large integer implicitly truncated to unsigned type   -  person curiousguy    schedule 23.07.2012


Ответы (1)


Для машины, которая использует дополнение до двух для целых чисел со знаком, правила преобразования в N -битный беззнаковый тип эквивалентны отбрасыванию всех битов, кроме младших N. для типичного оборудования это самый простой способ выполнить преобразование.

Стандарт разрешает другие представления для целых чисел со знаком, но использует те же правила преобразования для согласованности. Это может потребовать дополнительной работы на таких машинах, но (а) такие машины довольно редки и (б) расходы в любом случае должны быть довольно небольшими.

person Keith Thompson    schedule 15.07.2012