Come la maggior parte delle spiegazioni che ho visto, quelle sopra sono chiare su come lavorare con il complemento di 2, ma non spiegano veramente cosa sono matematicamente. Proverò a farlo, almeno per i numeri interi, e tratterò alcuni retroscena probabilmente prima familiari.
Ricorda come funziona per i decimali:
2345
è un modo di scrivere
2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .
Allo stesso modo, il binario è un modo di scrivere numeri usando solo 0 e 1 seguendo la stessa idea generale, ma sostituendo quei 10s sopra con 2s. Quindi, in binario,
1111
è un modo di scrivere
1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
e se lo risolvi, risulta essere uguale a 15 (base 10). Questo perché è
8 + 4 + 2 + 1 = 15.
Questo va bene e va bene per i numeri positivi. Funziona anche con numeri negativi se sei disposto a mettere un segno meno davanti a loro, come fanno gli umani con i numeri decimali. Questo può anche essere fatto nei computer, in un certo senso, ma non ho visto un simile computer dai primi anni '70. Lascerò i motivi di una discussione diversa.
Per i computer risulta essere più efficiente utilizzare una rappresentazione del complemento per i numeri negativi. Ed ecco qualcosa che viene spesso trascurato. Le notazioni del complemento comportano una sorta di inversione delle cifre del numero, anche gli zero impliciti che precedono un normale numero positivo. È imbarazzante, perché sorge la domanda: tutti loro? Potrebbe essere un numero infinito di cifre da considerare.
Fortunatamente, i computer non rappresentano gli infiniti. I numeri sono vincolati a una determinata lunghezza (o larghezza, se preferisci). Quindi torniamo ai numeri binari positivi, ma con una dimensione particolare. Userò 8 cifre ("bit") per questi esempi. Quindi il nostro numero binario sarebbe davvero
00001111
o
0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
Per formare il negativo del complemento a 2, per prima cosa completiamo tutte le cifre (binarie) nel modulo
11110000
e aggiungiamo 1 al modulo
11110001,
ma come possiamo capire che significa -15?
La risposta è che cambiamo il significato del bit di ordine superiore (quello più a sinistra). Questo bit sarà un 1 per tutti i numeri negativi. Il cambiamento sarà quello di cambiare il segno del suo contributo al valore del numero in cui appare. Quindi ora il nostro 11110001 è inteso rappresentare
- 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Notare che "-" davanti a quell'espressione? Significa che il bit del segno ha il peso -2 7 , cioè -128 (base 10). Tutte le altre posizioni mantengono lo stesso peso che avevano nei numeri binari senza segno.
Elaborando il nostro -15, è
-128 + 64 + 32 + 16 + 1
Provalo sulla tua calcolatrice. sono -15.
Dei tre modi principali in cui ho visto i numeri negativi rappresentati nei computer, il complemento di 2 vince a mani basse per comodità nell'uso generale. Ha una stranezza, però. Poiché è binario, ci deve essere un numero pari di possibili combinazioni di bit. Ogni numero positivo può essere associato al suo negativo, ma c'è solo uno zero. Negare uno zero ti dà zero. Quindi c'è un'altra combinazione, il numero con 1 nel bit del segno e 0 ovunque. Il corrispondente numero positivo non si adatterebbe al numero di bit utilizzati.
La cosa ancora più strana di questo numero è che se provi a formarne il positivo completando e aggiungendo uno, ottieni lo stesso numero negativo. Sembra naturale che lo zero farebbe questo, ma questo è inaspettato e non è affatto il comportamento a cui siamo abituati perché a parte i computer, generalmente pensiamo a un numero illimitato di cifre, non a questa aritmetica a lunghezza fissa.
È come la punta di un iceberg di stranezze. C'è di più in agguato sotto la superficie, ma è abbastanza per questa discussione. Probabilmente potresti trovare di più se cerchi "overflow" per l'aritmetica in virgola fissa. Se vuoi davvero approfondire, potresti anche cercare "aritmetica modulare".