Esistono tre modi diversi per rappresentare l'intero con segno (articolo). a: bit con segno, b: complemento a 1 e c: complemento a 2. Cerchiamo di capire come sono nati questi metodi e perché il complemento a 2 è preferito rispetto ad altri.
Come sappiamo, i dati vengono archiviati in bit. Come possiamo memorizzare l'intero con segno nella memoria? Per risolvere questo problema, prima svilupperemo una soluzione ingenua e poi la ripeteremo finché non avremo la soluzione migliore per il nostro problema.
a) Bit con segno
Quando si tenta di memorizzare un intero con segno, sembra ovvio riservare il bit più a sinistra per il segno e utilizzare i bit rimanenti per memorizzare effettivamente i valori. Ad esempio: nel sistema a 4 bit, il primo bit da sinistra sarà riservato al segno (0 rappresenta il positivo mentre 1 rappresenta il negativo) e gli altri 3 bit verranno utilizzati per memorizzare i valori. Allo stesso modo nel sistema a 8 bit, il primo bit da sinistra verrà utilizzato per il segno e i rimanenti 7 verranno utilizzati per i valori.
Signor No. | Rappresentazione binaria | Valore decimale |
UN | 0000 | +0 |
B | 0001 | +1 |
C | 0010 | +2 |
D | 0011 | +3 |
E | 0100 | +4 |
F | 0101 | +5 |
G | 0110 | +6 |
H | 0111 | +7 |
IO | 1000 | -0 |
J | 1001 | -1 |
K | 1010 | -2 |
l | 1011 | -3 |
M | 1100 | -4 |
N | 1101 | -5 |
O | 1110 | -6 |
P | 1111 | -7 |
Utilizzando questo approccio, siamo in grado di rappresentare con successo un intero con segno. Ma quando lo analizziamo più da vicino, potremmo osservare i seguenti inconvenienti:
1) Due rappresentazioni di zero:
Nel sistema a 4 bit, dovremmo essere in grado di memorizzare 16 (24) valori, ma da +1 a +7 e da -1 a -7 sono solo 14 valori. Dove sono i due valori rimanenti? Osservando attentamente la tabella, scopriremo che questi due valori convergono a 0. Quindi, abbiamo due rappresentazioni dello zero, ovvero una rappresentazione per +0 e un'altra per -0.
Ma due rappresentazioni di 0 sono una grande preoccupazione? E allora? Invece di 16 valori univoci, siamo in grado di memorizzare solo 15 valori. Possiamo permetterci di ridurre l’intervallo di 1, non è vero? Per lo sviluppatore del software, potrebbe non preoccupare, ma per un progettista di circuiti potrebbe essere molto frustrante verificare prima se il valore è +0 e poi verificare se è -0.
2) L'estensione firmata non funziona con i numeri negativi:
La dimensione dei dati sta aumentando rapidamente. Prima o poi dovremo estendere il sistema di bit in modo da poter aumentare la gamma di dati che possono essere archiviati. Nel 2014, il video Gangnam Style ha superato il limite di visualizzazione di YouTube e ha costretto YouTube ad aggiornare il conteggio delle visualizzazioni da 32 bit a 64 bit con segno intero. Allo stesso modo, l'orologio Unix a 32 bit andrà in overflow il 19 gennaio 2038 perché registra il tempo in secondi in un intero con segno a 32 bit.
Pertanto, è altrettanto importante che il nostro sistema di rappresentanza sia facilmente estendibile, cosa che non è possibile con questo sistema di rappresentanza.
Decimale | 4 bit | 5 bit | 6 bit |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1010 | 10010 (!= 11010) | 100010 (!= 111010) |
-7 | 1111 | 10111 (!= 11111) | 100111 (!= 111111) |
3) L’addizione binaria non funziona:
Proviamo ad aggiungere due numeri binari:
Binario | Decimale | conversione e casting del tipo Java | Binario | Decimale | Binario | Decimale | ||
Numero 1 | 0010 | +2 | 0111 | +7 | 1101 | -5 | ||
Numero 2 | 1010 | -2 | 1010 | -2 | 0011 | +3 | ||
Addizione binaria | 1100 | -4 | 0001 | +1 | 0000 | +0 | ||
Aggiunta decimale | +0 | +5 | -2 |
Perché una semplice addizione binaria non funziona qui? Il motivo è che il bit del segno (all'estrema sinistra) non è un bit ordinario e non fa parte del numero effettivo. Immagina la situazione in cui è necessario progettare il circuito hardware per ignorare il bit di segno per eseguire l'addizione e quindi aggiungere il bit di segno.
Quindi, questo era un modo ingenuo per rappresentare un intero con segno. Il problema principale con questo approccio è che abbiamo mappato i numeri negativi dall’alto verso l’alto. Se modifichiamo il nostro sistema di mappatura per posizionarli dall'alto verso il basso, alcuni dei problemi di cui sopra verranno risolti.
b) 1's Co implementare
Se rimappiamo i nostri numeri negativi dall'alto verso il basso, otterremo la seguente tabella binaria:
Si No. | Rappresentazione binaria | Valore decimale | |
complemento di 1 | Pezzo firmato | ||
UN | 0000 | +0 | +0 |
B | 0001 | +1 | +1 |
C | 0010 | +2 | +2 |
D | 0011 | +3 | +3 |
E | 0100 | +4 | +4 |
F | 0101 | +5 | +5 |
G | 0110 | +6 | +6 |
H | 0111 | +7 | +7 |
IO | 1000 | -7 | -0 |
J | 1001 | -6 | -1 |
K | 1010 | -5 | -2 |
l | 1011 | -4 | -3 |
M | 1100 | -3 | -4 |
N | 1101 | -2 | -5 |
O | 1110 | -1 | -6 |
P | 1111 | -0 | -7 |
Come ottenere la rappresentazione binaria di un numero intero nel metodo del complemento a 1?
- I numeri positivi sono rappresentati in modo simile al metodo degli interi con segno
- I numeri negativi sono rappresentati invertendo ogni bit del corrispondente numero positivo (l'inversione può essere facilmente eseguita utilizzando la porta NOT durante la progettazione dell'hardware)
Analizziamolo da vicino per vedere se abbiamo ottenuto qualche miglioramento.
1) Due rappresentazioni di zero:
Anche in questo approccio abbiamo due rappresentazioni dello zero.
2) L'estensione firmata non funziona con i numeri negativi:
L'estensione firmata funziona perfettamente con i numeri negativi.
Decimale | 4 bit | 5 bit | 6 bit |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1101 | 11101 | 111101 |
-7 | 1000 | 11000 | 111000 |
3) L'addizione binaria funziona con regole modificate:
Binario | Decimale | Binario | Decimale | Binario | Decimale | |||
Numero 1 | 0010 | +2 | 0111 | +7 | 1010 | -5 | ||
Numero 2 | 1101 | -2 | 1101 | -2 | 0011 | +3 | ||
Addizione binaria | 1111 | -0 | 0100 | +4 | 1101 | -2 | ||
Aggiunta decimale | +0 | +5 | -2 |
La risposta non è sempre corretta, ma è molto vicina alla risposta giusta. Possiamo farlo funzionare se seguiamo la regola che se hai generato un riporto all'estrema sinistra, non buttarlo via, ma riportalo indietro e aggiungilo all'estrema destra.
rinominare la cartella Linux
Binario | Decimale | Binario | Decimale | Binario | Decimale | |||
Numero 1 | 0111 | +7 | 1110 | -1 | 0111 | +7 | ||
Numero 2 | 1101 | -2 | 1001 | -6 | 1011 | -4 | ||
Addizione binaria | (1) 0100 | +4 | (1) 0111 | +7 | (1) 0010 | +2 | ||
Aggiunta di riporto indietro | 0101 | +5 | 1000 | -7 | 0011 | +3 |
Sicuramente il metodo del complemento a 1 è migliore del bit con segno. Le nostre principali preoccupazioni sono state risolte ma rimangono un problema (avere due rappresentazioni dello zero) e il nostro hack nell'addizione binaria fornisce indizi per migliorare il metodo del complemento a 1. Riformuliamo queste frasi per renderlo più semplice.
- Abbiamo una rappresentazione aggiuntiva dello zero che non è necessaria
- Durante l'addizione di due numeri binari, se abbiamo un riporto nel bit più a sinistra, dobbiamo aggiungere +1 al risultato, ovvero la risposta giusta può essere trovata passando alla riga successiva nella tabella binaria.
Entrambi ci indicano che una rappresentazione aggiuntiva dello zero è la causa principale del problema. Quindi, rimuoviamo questo zero extra e spostiamo tutti i valori negativi alla riga successiva (-7 si sposterà da I -> J, -6 si sposterà da J -> K e così via...)
c) Complemento a 2
Quando rimuoviamo -0 dalla tabella del complemento a 1 e spostiamo tutti i valori negativi una riga sotto, otterremo la seguente tabella chiamata complemento a 2:
Si No. | Rappresentazione binaria | Valore decimale | |||
complemento a 2 | complemento di 1 | Pezzo firmato | |||
UN | 0000 | +0 | +0 | +0 | |
B | 0001 | +1 | +1 | +1 | |
C | 0010 | +2 | +2 | +2 | |
D | 0011 | +3 | +3 | +3 | |
E | 0100 | +4 | +4 | +4 | |
F | 0101 | +5 | +5 | +5 | |
G | 0110 | +6 | +6 | +6 | |
H | 0111 | +7 | +7 | +7 | |
IO | 1000 | -8 | -7 | -0 | |
J | 1001 | -7 | = inverso di 7 + 1 bit | -6 | -1 |
K | 1010 | -6 | = inverso di 6 + 1 bit | -5 | -2 |
l | 1011 | -5 | = inverso di 5 + 1 bit | -4 | -3 |
M | 1100 | -4 | = inverso di 4 + 1 bit | -3 | -4 |
N | 1101 | -3 | = inverso di 3 + 1 bit | -2 | -5 |
O | 1110 | -2 | = inverso di 2 + 1 bit | -1 | -6 |
P | 1111 | -1 | = inverso di 1 + 1 bit | -0 | -7 |
Come ottenere la rappresentazione binaria di un numero intero nel metodo del complemento a 2?
- I numeri positivi sono rappresentati in modo simile al metodo degli interi con segno
- I numeri negativi sono rappresentati invertendo ogni bit del numero positivo corrispondente e quindi aggiungendovi 1 bit
1) Una rappresentazione di zero:
Ora abbiamo una sola rappresentazione dello zero e ci consente di archiviare totale 16 valori univoci (da +0 a +7 e da -1 a -8).
2) L'estensione con segno funziona con i numeri negativi:
L'estensione firmata funziona perfettamente con i numeri negativi.
Decimale | 4 bit | 5 bitazienda vs azienda | 6 bit |
+2 | 0010 | 00010 | 000010 |
+7 | 0111 | 00111 | 000111 |
-2 | 1110 | 11110 | 111110 |
-7 | 1001 | 11001 | 111001 |
3) Addizione binaria:
Binario | Decimale | Binario | Decimale | Binario | Decimale | Binario | Decimale | ||||
Numero 1 | 0010 | +2 | 0111 | +7 | 1011 | -5 | 1111 | -1 | |||
Numero 2 | 1110 | -2 | 1110 | -2 | 0011 | +3 | 1010 | -6 | |||
Risposta | 0000 | +0 | 0101 | +5 | 1110 | -2 | 1001 | -7 |
4) Il primo bit è un bit con segno:
Il complemento a 2 ha questa bella proprietà che il primo bit è un bit di segno perché tutti i positivi iniziano con 0 mentre tutti i negativi con 1.
5) Controllo dell'overflow della memoria:
Durante l'addizione, ci siamo assicurati che la nostra risposta rientrasse nell'intervallo, ma durante la progettazione dell'hardware è necessario rilevare l'overflow della memoria. Sarebbe una pessima idea per i progettisti hardware controllare l'entità per rilevare l'overflow. Il metodo del complemento di 2 fornisce un modo molto semplice per rilevare l’overflow della memoria. IO Se il riporto sul bit con segno non è uguale al riporto sul bit con segno, allora è un caso di overflow della memoria cioè, se il riporto sul bit con segno è 0 ma l'esecuzione è 1 o se il riporto 1 ma l'esecuzione è 0, allora è un caso di overflow della memoria.
Binario | Decimale | Binario | Decimale | Binario | Decimale | Binario | Decimale | ||||
Numero 1 | 1011 | -5 | 0010 | 2 | 0111 | +7 | 1011 | -5 | |||
Numero 2 | 1100 | -4 | 0110 | 6 | 1110 | -2 | 0011 | 3 | |||
Aggiunta | (1) 0111 | (0)1000 | (1)0101 | (0)1110 | |||||||
portare dentro per firmare il bit | 0 | traboccamento | 1 | traboccamento | 1 | NO | 0 | NO | |||
eseguire per firmare il bit | 1 | 0 | 1 | 0 |