Lo standard C non impone alcun modo particolare di rappresentare i numeri con segno negativo.
Nella maggior parte delle implementazioni che potresti incontrare, gli interi con segno negativo sono memorizzati in quello che è chiamato complemento a due . L'altro modo principale di memorizzare i numeri con segno negativo è chiamato one's complement .
Il complemento a due di un numero N di% x
è definito come 2^N - x
. Ad esempio, il complemento a due di 8-bit 1
è 2^8 - 1
o 1111 1111
. Il complemento a due di 8-bit 8
è 2^8 - 8
, che in binario è 1111 1000
. Questo può anche essere calcolato capovolgendo i bit di x
e aggiungendone uno. Ad esempio:
1 = 0000 0001
~1 = 1111 1110
~1 + 1 = 1111 1111
-1 = 1111 1111
21 = 0001 0101
~21 = 1110 1010
~21 + 1 = 1110 1011
-21 = 1110 1011
Il complemento a un numero di N bit x è definito come x con tutti i suoi bit capovolti, in pratica.
1 = 0000 0001
-1 = 1111 1110
21 = 0001 0101
-21 = 1110 1010
Il complemento a due ha diversi vantaggi rispetto al proprio complemento. Ad esempio, non ha il concetto di "zero negativo", che per una buona ragione confonde molte persone. Addizione, moltiplicazione e sottrazione funzionano allo stesso modo con interi con segno implementati con due completati come fanno anche con interi senza segno.