È fatto in modo che l'addizione non debba avere una logica speciale per gestire i numeri negativi. Dai un'occhiata all'articolo su Wikipedia .
Supponi di avere due numeri, 2 e -1. Nel tuo modo "intuitivo" di rappresentare i numeri, sarebbero 0010
e 1001
, rispettivamente (sto aderendo a 4 bit per dimensione). Nel modo del complemento a due , sono 0010
e1111
. Ora, diciamo che voglio aggiungerli.
L'aggiunta del complemento a due è molto semplice. Aggiungete i numeri normalmente e ogni bit di trasporto alla fine viene scartato. Quindi vengono aggiunti come segue:
0010
+ 1111
=10001
= 0001 (discard the carry)
0001
è 1, che è il risultato atteso di "2 + (- 1)".
Ma nel tuo metodo "intuitivo", l'aggiunta è più complicata:
0010
+ 1001
= 1011
Qual è -3, giusto? L'aggiunta semplice non funziona in questo caso. È necessario notare che uno dei numeri è negativo e, in tal caso, utilizzare un algoritmo diverso.
Per questo metodo di memorizzazione "intuitivo", la sottrazione è un'operazione diversa dall'aggiunta, che richiede ulteriori controlli sui numeri prima che possano essere aggiunti. Poiché si desidera che le operazioni di base (addizione, sottrazione, ecc.) Siano il più veloci possibile, è necessario memorizzare i numeri in un modo che consenta di utilizzare gli algoritmi più semplici possibili.
Inoltre, nel metodo di archiviazione "intuitivo", ci sono due zero:
0000 "zero"
1000 "negative zero"
Che sono intuitivamente lo stesso numero ma hanno due valori diversi se memorizzati. Ogni applicazione dovrà adottare ulteriori misure per assicurarsi che anche i valori diversi da zero non siano zero negativo.
C'è un altro vantaggio con la memorizzazione di ints in questo modo, ed è allora che è necessario estendere la larghezza del registro in cui è archiviato il valore. Con il complemento a due, la memorizzazione di un numero a 4 bit in un registro a 8 bit è una questione di ripetere il suo bit più significativo:
0001 (one, in four bits)
00000001 (one, in eight bits)
1110 (negative two, in four bits)
11111110 (negative two, in eight bits)
È solo una questione di guardare il segno della parola più piccola e di ripeterlo fino a quando non riempie la larghezza della parola più grande.
Con il tuo metodo dovrai cancellare il bit esistente, che è un'operazione aggiuntiva oltre al riempimento:
0001 (one, in four bits)
00000001 (one, in eight bits)
1010 (negative two, in four bits)
10000010 (negative two, in eight bits)
È comunque necessario impostare quei 4 bit extra in entrambi i casi, ma nel caso "intuitivo" è necessario cancellare anche il 5 ° bit. È un piccolo passo in più in una delle operazioni più fondamentali e comuni presenti in ogni applicazione.