ISO C wskazuje na różnice.
Typ danych int
jest podpisany i ma minimalny zakres od co najmniej -32767 do 32767 włącznie. Rzeczywiste wartości są podane odpowiednio w limits.h
jako i .
Wartość unsigned int
ma minimalny zakres od 0 do 65535 włącznie, a rzeczywista maksymalna wartość to UINT_MAX
z tego samego pliku nagłówkowego.
Poza tym standard nie wymaga dwóch notacji uzupełniającej do kodowania wartości, to tylko jedna z możliwości.Trzy dozwolone typy musiałby kodowanie następujących dokumentów dla 5 i -5 (używając typów 16-bitowe dane):
two's complement | ones' complement | sign/magnitude
+---------------------+---------------------+---------------------+
5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 |
-5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 |
+---------------------+---------------------+---------------------+
- w dwóch uzupełnień, masz ujemny z licznych odwracając wszystkie bity następnie dodanie 1.
- W swoim uzupełnieniu otrzymuje się ujemną liczbę poprzez odwrócenie wszystkich bitów.
- W znaku/magnitu, górny bit jest znakiem, więc po prostu odwróć to, aby uzyskać negatyw.
Należy zauważyć, że wartości dodatnie mają takie same kodowanie dla wszystkich reprezentacji, a wartości ujemne są różne.
Należy zauważyć, że dla wartości niepodpisanych nie trzeba używać jednego z bitów do znaku. Oznacza to, że masz większy zasięg po stronie dodatniej (oczywiście bez negatywnych kodowań).
I nie, 5
i -5
nie mogą mieć tego samego kodowania, niezależnie od używanej reprezentacji. W przeciwnym razie nie byłoby sposobu, by odróżnić.
To pytanie może wymagać rozdziału do opracowania. Jeśli chcesz poznać tajniki, sprawdź [Unsigned i Signed Integers] (http://kias.dyndns.org/comath/13.html), aby uzyskać więcej wyjaśnień. – anonymous