I calcolatori rappresentano gli interi negativi quasi sempre in complemento a due: una codifica che permette di sommare e sottrarre con lo stesso circuito, senza gestire separatamente il segno. Questa scheda allena la rappresentazione, l’intervallo dei valori e l’aritmetica con segno.
Complemento a due su n bit: il negativo di x è \;2^n-x, ottenuto invertendo i bit e sommando 1.
1. Rappresentazione di un negativo
Esercizio. Rappresentare -5 in complemento a due su 8 bit.
Passo 1 — modulo in binario: 5=00000101_2.
Passo 2 — invertire i bit: 11111010.
Passo 3 — sommare 1: 11111010+1=11111011.
-5=11111011_2\ (\text{compl. a 2, 8 bit}).
Il bit più significativo (1) indica il segno negativo. Verifica: 256-5=251=11111011_2. ✓
2. Lettura di un numero in complemento a due
Esercizio. Quale valore decimale rappresenta 11110000_2 in complemento a due su 8 bit?
Il bit più significativo è 1 → numero negativo. Si calcola il complemento per trovare il modulo:
\text{inverti } 11110000\to00001111,\quad +1\to00010000=16.
11110000_2=-16.
Il valore è -16. Per i numeri con MSB = 1 si applica il complemento a due per leggere il modulo, poi si mette il segno meno.
3. Intervallo rappresentabile
Esercizio. Qual è l’intervallo dei numeri rappresentabili in complemento a due su 8 bit?
Con n=8 bit, il complemento a due copre:
[-2^{n-1},\ 2^{n-1}-1]=[-128,\ +127].
Asimmetrico: un valore negativo in più (-128 esiste, +128 no), perché lo zero ha una sola rappresentazione. È la caratteristica distintiva del complemento a due rispetto ad altre codifiche.
4. Sottrazione come somma
Esercizio. Calcolare 7-5 in complemento a due su 8 bit, usando la somma.
La sottrazione 7-5 diventa 7+(-5):
00000111+11111011=1\ 00000010.
Il riporto oltre l’8° bit si scarta, restando 00000010_2=2. Verifica: 7-5=2. ✓ Il complemento a due trasforma ogni sottrazione in una somma: un solo circuito addizionatore basta.
5. Estensione del segno
Esercizio. Estendere -5=1011_2 (compl. a 2 su 4 bit) a 8 bit.
L’estensione del segno replica il bit più significativo a sinistra:
1011\ (\text{4 bit})\ \to\ 11111011\ (\text{8 bit}).
Il bit di segno (1) si copia nei nuovi bit a sinistra. Verifica: entrambi rappresentano -5. Per i positivi si estende con zeri. È necessaria quando si opera tra numeri di larghezza diversa.
6. Negazione di un numero
Esercizio. Calcolare -(-6) in complemento a due su 8 bit, partendo da -6=11111010_2.
Negare = applicare di nuovo il complemento a due (inverti e +1):
\text{inverti } 11111010\to00000101,\quad +1\to00000110=6.
-(-6)=+6.
Applicare due volte il complemento a due riporta al numero originale: la negazione è involutiva. Verifica: 00000110_2=6. ✓
7. Somma con numeri di segno diverso
Esercizio. Calcolare -12+7 in complemento a due su 8 bit.
Rappresentiamo i due operandi:
perché invertendo 00001100 si ottiene 11110011 e sommando 1 si ottiene 11110100. Inoltre:
Somma:
Il risultato ha MSB = 1, quindi è negativo. Per leggerne il modulo:
Quindi:
Con operandi di segno diverso non c’è overflow in complemento a due: il risultato resta sempre tra i due valori iniziali.
8. Il caso limite: il minimo negativo
Esercizio. Perché su 8 bit non si può rappresentare +128 in complemento a due, mentre si può rappresentare -128?
L’intervallo su 8 bit è:
Il valore -128 è:
Se proviamo a negarlo applicando il complemento a due:
Si ottiene lo stesso pattern. Questo non significa che -128=+128: significa che +128 non è rappresentabile su 8 bit. Il minimo negativo è un caso speciale perché l’intervallo è asimmetrico.
9. Estensione errata del segno
Esercizio. Cosa succede se 1011_2 su 4 bit viene esteso a 8 bit con zeri invece che con il segno?
Su 4 bit, 1011_2 ha MSB = 1, quindi rappresenta:
L’estensione corretta è:
Se invece si estende con zeri:
Il valore cambia da -5 a +11: è un errore semantico, non solo formale. Nelle architetture reali per questo esistono istruzioni distinte di sign extension e zero extension.
Errori comuni
- Dimenticare il “+1” nel complemento. Il complemento a due è inverti i bit e somma 1: fermarsi all’inversione dà il complemento a uno (codifica diversa).
- Sbagliare l’intervallo. Su n bit è [-2^{n-1},\,2^{n-1}-1]: il limite negativo ha modulo 1 in più del positivo.
- Negare senza controllare il caso minimo. Il valore -2^{n-1} non ha opposto rappresentabile su n bit.
- Estendere con zeri un negativo. L’estensione del segno replica l’MSB: per i negativi si estende con uni, non con zeri.
- Considerare il riporto finale un errore. Nella sottrazione il riporto oltre l’ultimo bit si scarta (non è overflow): il risultato è corretto.