Liczby całkowite ze znakiem w C reprezentują liczby. Jeśli a
i b
są zmiennymi typów całkowitych ze znakiem, standard nigdy nie będzie wymagał od kompilatora przekształcenia wyrażenia a+=b
w a
nic innego niż sumę arytmetyczną ich odpowiednich wartości. Oczywiście, jeśli suma arytmetyczna nie byłaby dopasowana a
, procesor może nie być w stanie jej tam umieścić, ale standard nie wymagałby od kompilatora obcinania lub zawijania wartości, ani robienia czegokolwiek innego w tym zakresie, jeśli wartości przekraczające limity dla ich typów. Należy zauważyć, że chociaż standard tego nie wymaga, implementacje języka C mogą przechwytywać przepełnienia arytmetyczne o podpisanych wartościach.
Niespisane liczby całkowite w C zachowują się jak abstrakcyjne algebraiczne pierścienie liczb całkowitych, które są zgodne z pewną potęgą dwóch, z wyjątkiem scenariuszy obejmujących konwersje na większe typy lub operacje z nimi. Konwersja liczby całkowitej o dowolnym rozmiarze na 32-bitowy typ bez znaku da element członkowski odpowiadający rzeczom, które są zgodne z tym modem całkowitym 4,294,967,296. Powodem odjęcia 3 od 2 daje 4 294 967 295, że dodanie czegoś zgodnego do 3 do czegoś zgodnego do 4 294 967 295 da coś zgodnego do 2.
Abstrakcyjne typy pierścieni algebraicznych to często przydatne rzeczy; niestety C używa sygnatury jako decydującego czynnika decydującego o tym, czy typ powinien zachowywać się jak pierścień. Co gorsza, niepodpisane wartości są traktowane jako liczby, a nie pierścieniowe elementy, gdy są konwertowane na większe typy, a niepodpisane wartości mniejsze niż int
są konwertowane na liczby, gdy wykonywana jest na nich jakaś arytmetyka. Jeśli v
jest uint32_t
równy 4,294,967,294
, to v*=v;
powinien zrobić v=4
. Niestety, jeśli int
ma 64 bity, nie wiadomo, co v*=v;
można zrobić.
Biorąc pod uwagę obecny standard, sugerowałbym używanie typów niepodpisanych w sytuacjach, w których chce się zachowania związanego z pierścieniami algebraicznymi, a typów podpisanych, gdy chcemy reprezentować liczby. Szkoda, że C narysował rozróżnienia w ten sposób, ale są tacy, jacy są.