So che ha qualcosa a che fare con il complemento a 2 e l'aggiunta di 1, ma in realtà non capisco come sia possibile codificare un numero in più con la stessa quantità di bit quando si tratta di numeri negativi.
Pensaci in questi termini. Prendi un numero a 2 bit con un segno precedente:
000 = 0
001 = 1
010 = 2
011 = 3
Ora abbiamo alcuni aspetti negativi:
111 = -1
110 = -2
101 = -3
Aspetta, abbiamo anche
100 ...
Deve essere negativo, perché il bit di segno è 1. Quindi, logicamente, deve essere -4.
(Modifica: come WorldEngineer sottolinea giustamente , non tutti i sistemi di numerazione funzionano in questo modo - ma quelli stai chiedendo di fare.)
Perché non ci sono due classi di numeri nell'intervallo intero, ma tre: numeri negativi, zero e numeri positivi. Zero deve occupare uno spazio (sarebbe piuttosto poco pratico non essere in grado di rappresentare zero ...), quindi la classe positiva o negativa deve rinunciare a uno slot. Il fatto che di solito sia il range positivo a dover fare quel sacrificio è in una certa misura arbitrario, ma a livello di manipolazioni di bit ci sono alcune cose che rendono questa decisione più comoda.
Ci sono fondamentalmente tre modi per rappresentare interi con segno in binario: complemento a 2, complemento a 1 e grandezza del segno. (La biologia ha fatto la fine del Dodo Bird molto tempo fa.)
Il complemento e la grandezza del segno di 1 hanno due valori zero, +0 e -0, ciascuno con una rappresentazione univoca. Il complemento a 2 ha solo un valore zero e una rappresentazione.
Ora, un campo di N bit può codificare 2 ^ N valori. Sottrai un complemento a 2 e hai 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Poiché la rappresentazione per zero è tutti zero bit e un segno + è zero, ci sarà un'altra possibile rappresentazione diversa da zero con il bit del segno impostato su 1.
Questo è un modo molto prolisso per dire che il complemento a 2 rappresenta i valori nell'intervallo - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).
Il complemento a 1 ha in realtà un vantaggio rispetto al complemento a 2 se si eseguono calcoli di elaborazione del segnale digitale intero. Le operazioni di complemento 1 intrinsecamente troncano verso lo zero. Il complemento a 2 tronca verso l'infinito. Ho imparato questo in modo HARD ...