Complemento a due e numeri con segno: esercizi svolti

Indice dei contenuti

    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:

    12=00001100_2,\qquad -12=11110100_2,

    perché invertendo 00001100 si ottiene 11110011 e sommando 1 si ottiene 11110100. Inoltre:

    7=00000111_2.

    Somma:

    \begin{array}{r} 11110100\\ +\ 00000111\\\hline 11111011 \end{array}

    Il risultato ha MSB = 1, quindi è negativo. Per leggerne il modulo:

    11111011\to00000100,\quad +1\to00000101=5.

    Quindi:

    11111011_2=-5,\qquad -12+7=-5.

    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 è:

    [-2^7,\ 2^7-1]=[-128,\ 127].

    Il valore -128 è:

    10000000_2.

    Se proviamo a negarlo applicando il complemento a due:

    10000000\to01111111,\quad +1\to10000000.

    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:

    1011_2=-5.

    L’estensione corretta è:

    1011\to11111011=-5.

    Se invece si estende con zeri:

    1011\to00001011=11.

    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.

    Ultimo aggiornamento: