Знаковые целые числа в C представляют числа. Если a
и b
являются переменными целочисленных типов со знаком, стандарт никогда не потребует, чтобы компилятор заставил выражение a+=b
сохранить в a
что-либо кроме арифметической суммы их соответствующих значений. Чтобы быть уверенным, что если арифметическая сумма не поместится в a
, процессор может не сможет поместить ее туда, но стандарт не потребует, чтобы компилятор урезал или обернул значение, или сделал бы что-нибудь еще в этом отношении, если значения, которые превышают пределы для их типов. Обратите внимание, что, хотя стандарт не требует этого, реализациям C разрешается перехватывать арифметические переполнения со знаковыми значениями.
Беззнаковые целые числа в C ведут себя как абстрактные алгебраические кольца целых чисел, которые являются конгруэнтными по модулю некоторой степени двух, за исключением сценариев, включающих преобразования или операции с большими типами. Преобразование целого числа любого размера в 32-разрядный тип без знака приведет к члену, соответствующему вещам, которые соответствуют этому целочисленному модулю 4 294 967 296. Причина, по которой вычитание 3 из 2 дает 4 294 967 295, состоит в том, что добавление чего-то равного 3 к чему-то равному 4 294 967 295 даст что-то равное 2.
Абстрактные типы алгебраических колец часто бывают удобны; к сожалению, C использует подпись как решающий фактор того, должен ли тип вести себя как кольцо. Хуже того, значения без знака обрабатываются как числа, а не как члены кольца при преобразовании в более крупные типы, а значения без знака, меньшие int
, преобразуются в числа, когда над ними выполняется любая арифметика. Если v
является uint32_t
, что равно 4,294,967,294
, то v*=v;
должно составить v=4
. К сожалению, если int
равен 64 битам, то неясно, что v*=v;
может сделать.
Учитывая данный стандарт, я бы предложил использовать неподписанные типы в ситуациях, когда нужно поведение, связанное с алгебраическими кольцами, и подписанных типов, когда он хочет представлять числа. К сожалению, C провел различия так же, как и он, но они такие, какие они есть.