Numeri con segno, complemento a 2, sottrazione e overflow
In questa pagina 7
Il sommatore (Sommatori binari - half adder, full adder e ripple carryHalf adder (2 ingressi): $S=X\oplus Y$, $C=XY$. Full adder (3 ingressi, con riporto in ingresso $Z$): $S=X\oplus Y\oplus Z$, $C=XY+XZ+YZ=G+PZ$ con $P=X\oplus Y$, $G=XY$; si realizza con due half adder e una OR. Il ripple carry adder a $n$ bit concatena $n$ full adder: il riporto "ondeggia" dal LSB al MSB, quindi il ritardo cresce linearmente con $n$. È un circuito iterativo (gerarchico e regolare). Il moltiplicatore a 2 bit usa 4 AND e 2 half adder.Sommatori binari - half adder, full adder e ripple carry →) lavora su numeri senza segno. Come rappresentare i numeri negativi, in modo che lo stesso circuito faccia somme e sottrazioni? La risposta è il complemento a 2. (Un'altra trattazione è in Rappresentazione dei numeri interi con segnoInteri con segno su n bit: modulo e segno, complemento a 1, complemento a 2 ed eccesso K; intervalli rappresentabili, calcolo dell'opposto, estensione del segno.Rappresentazione dei numeri interi con segno → e Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →.)
Sottrazione di numeri senza segno
- Se : nessun prestito in uscita dal bit più significativo, e il risultato è corretto.
- Se : c'è un prestito in uscita e il risultato è , sbagliato. Il valore assoluto corretto è meno il risultato ottenuto (il suo complemento a 2), e il segno è negativo.
Esempio (): (). Il risultato a 8 bit è (), con prestito in uscita (). Valore assoluto: . Risultato corretto: .
Altro esempio con : () (), nessun prestito.
Complementi
Definizione (complemento a 1 e a 2). Dato su bit:
- complemento a 1: , cioè il complemento di ogni bit (si scambiano 0 e 1);
- complemento a 2: , cioè complemento a 1 più 1.
Esempio. su bit: complemento a 1 (bit invertiti), complemento a 2 .
| complemento a 1 | complemento a 2 | |
|---|---|---|
Il complemento del complemento restituisce . Per il complemento a 2 su bit è ancora (si scarta il riporto).
Sottrazione con il complemento a 2. Poiché , si somma a il complemento a 2 di e si toglie :
- se la somma produce un riporto in uscita (il termine ), che si scarta: resta ;
- se non c'è riporto in uscita e la somma vale , il complemento a 2 della differenza: per ottenere il modulo si ripete il complemento a 2, e si mette il segno meno.
In questo modo la stessa addizione serve per sommare e sottrarre; con i numeri in complemento a 2 (sotto) l'ultimo passaggio sparisce.
Rappresentare numeri con segno
Si vedono due rappresentazioni a bit.
Segno e modulo. Si antepone un bit di segno: per positivi (e zero), per negativi. Un numero e il suo opposto differiscono solo per il bit di segno. Con 4 bit: da a , ma lo zero ha due rappresentazioni ( e ). Le operazioni trattano segno e modulo separatamente, quindi la sottrazione richiede una correzione di segno.
Definizione (numeri con segno in complemento a 2). I positivi sono come in senza segno ( seguito dal modulo); un negativo si rappresenta con il complemento a 2 di , cioè . L'MSB è per tutti i positivi e per tutti i negativi. Con 4 bit:
bit senza segno segno e modulo complemento a 2 0000 0 0 0111 7 7 7 1000 8 1001 9 1010 10 1011 11 1100 12 1101 13 1110 14 1111 15
Esempio. A bit .
Proprietà (intervallo e peso dell'MSB in complemento a 2). In complemento a 2 c'è un solo zero e l'intervallo è asimmetrico: da a (con 8 bit da a ; non è rappresentabile). Il valore si legge dando all'MSB il peso : .
Esempio. A bit l'intervallo è da a ; .
Esempi a 8 bit: ; : segno e modulo , complemento a 2 (: si inverte e si somma 1). : segno e modulo , complemento a 2 . Il numero a 8 bit in complemento a 2 è . Estensione del segno: per aumentare i bit di un numero in complemento a 2 si replica l'MSB ( resta ).
I calcolatori usano il complemento a 2 perché somma e sottrazione condividono lo stesso hardware.
Somma e sottrazione con segno in complemento a 2
Somma: si sommano i numeri inclusi i bit di segno e si scarta il riporto in uscita dal bit di segno. Il risultato è in complemento a 2. Esempi a 8 bit:
| operazione | operandi | risultato | valore |
|---|---|---|---|
Formula (sottrazione in complemento a 2). , cioè si somma ad il complemento a 2 di : (complemento a 1 di più 1). Esempio: : , il suo complemento a 2 è (), e ✓.
Esempio. A bit, : , riporto scartato.
Circuito addizionatore-sottrattore
Con un solo circuito si fanno entrambe le operazioni: si introduce un segnale (0 = somma, 1 = sottrazione). Ogni bit passa per una porta XOR con : se passa , se passa (complemento a 1). Lo stesso segnale è il riporto in ingresso del primo full adder, e fornisce il "+1". Il sommatore calcola quindi (con ) oppure (con ). Per : quattro XOR, quattro full adder in cascata.
Overflow
L'overflow (straripamento) si ha quando il risultato non sta nei bit disponibili: per esempio con numeri a 4 bit. È un problema in ogni sistema con un numero di bit fissato; il sistema deve poterlo rilevare.
Numeri senza segno.
- Nella somma c'è overflow se il riporto in uscita dal bit più significativo vale 1.
- Nella sottrazione non può esserci overflow (il risultato non supera il minuendo); il riporto in uscita dell'addizionatore-sottrattore vale se (risultato corretto) e se (risultato da correggere con complemento e segno meno). Equivalente al "prestito" invertito.
Proprietà (overflow in complemento a 2). Somma e sottrazione di operandi di segno diverso non hanno mai overflow (il modulo non cresce). Si ha overflow solo se i due addendi (per la sottrazione: e ) hanno lo stesso segno e il risultato ha segno opposto. In termini di riporti: c'è overflow se il riporto che entra nel bit di segno è diverso dal riporto che esce dal bit di segno:
Esempio. A bit : , riporto entrante nel segno , uscente , quindi (il risultato sarebbe ).
Perché: se i due positivi sommano oltre , il riporto entra nel bit di segno (che diventa 1) ma non esce; se i due negativi scendono sotto , il riporto non entra ma esce. Con il risultato è errato.
Esempi a 8 bit (intervallo ):
- : ; riporto in ingresso al segno , in uscita : non sta, il risultato è letto come .
- : ; riporto in ingresso , in uscita : non sta, letto come .
- : , riporti e (al limite, ma corretto).
- : , riporti e (corretto).
Esercizi di riferimento (numeri in complemento a 2, MSB = segno):
- (a) (6 bit: ): somma , riporto in ingresso al segno , in uscita nessun overflow; risultato ✓.
- (b) (7 bit: ): somma ; riporto in ingresso al segno , in uscita overflow ().
- (c) (): nessun overflow, .
- (d) (, 7 bit): complemento a 2 del sottraendo ; ; riporti e nessun overflow; (il riporto in uscita si scarta).
VHDL
Con il package numeric_std il tipo signed rappresenta numeri in complemento a 2:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity add_signed is
port ( a, b : in std_logic_vector(7 downto 0);
s : out std_logic_vector(7 downto 0);
v : out std_logic ); -- overflow
end add_signed;
architecture beh of add_signed is
signal sum : std_logic_vector(7 downto 0);
begin
sum <= std_logic_vector(signed(a) + signed(b));
s <= sum;
v <= (a(7) xnor b(7)) and (a(7) xor sum(7)); -- stesso segno in ingresso, segno diverso in uscita
end beh;Il package fa interpretare i vettori come numeri con segno; con un package come std_logic_unsigned gli stessi vettori sarebbero senza segno (Introduzione al VHDL - entity, architecture, tipi e livelli di descrizioneVHDL è un linguaggio di descrizione dell'hardware (HDL), non di programmazione: le dichiarazioni sono concorrenti e descrivono blocchi di circuito; serve per documentare, simulare e sintetizzare. Un blocco ha una entity (nome e porte in/out) e almeno una architecture (cosa c'è dentro: structural con component e port map, dataflow con equazioni booleane, behavioral con comportamento). Tipi: std_logic (da 1164: '0','1','X','Z','U','-',...), std_logic_vector, bit, boolean, integer. Signal per i collegamenti interni, constant per i valori fissi.Introduzione al VHDL - entity, architecture, tipi e livelli di descrizione →).
Errori comuni
- Dire che in complemento a 2 il riporto in uscita indica overflow: per i numeri con segno conta il confronto tra il riporto entrante e quello uscente dal bit di segno.
- Calcolare il complemento a 2 invertendo i bit senza sommare 1.
- Credere che sia rappresentabile: l'intervallo è asimmetrico.
- Usare l'estensione con zeri (anziché replicare il segno) su un numero negativo.
- Scrivere a 8 bit come (è segno e modulo): in complemento a 2 è .
- Segno del risultato nella sottrazione senza segno: se c'è prestito va corretto con complemento e segno meno.
Versione ripasso
- Sottrazione senza segno: se non c'è prestito in uscita e il risultato è corretto. Se il risultato è sbagliato: il valore assoluto è meno il risultato, con segno negativo. Esempio (): con prestito; , quindi .
- Complementi: a 1 (si invertono i bit); a 2 = complemento a 1 più 1. Esempio: . Il complemento del complemento restituisce .
- Numeri con segno: segno e modulo ha due zeri ( e ) e intervallo simmetrico. Complemento a 2 ha un solo zero, intervallo da a , e l'MSB pesa : ; su 4 bit . Estensione del segno: resta .
- Somma: si sommano tutti i bit, incluso il segno, e si scarta il riporto in uscita dal bit di segno. Esempio: : ; : .
- Sottrazione: , quindi usa lo stesso sommatore con : XOR su ogni bit di e come riporto in ingresso. Esempio: .
- Overflow senza segno: nella somma c'è overflow se .
- Overflow con segno: . Operandi di segno diverso non danno mai overflow. Esempi a 8 bit: con (150 non sta nell'intervallo); con ; su 7 bit ha overflow.
- VHDL:
sum <= std_logic_vector(signed(a) + signed(b));e overflowv <= (a(7) xnor b(7)) and (a(7) xor sum(7));(Introduzione al VHDL - entity, architecture, tipi e livelli di descrizioneVHDL è un linguaggio di descrizione dell'hardware (HDL), non di programmazione: le dichiarazioni sono concorrenti e descrivono blocchi di circuito; serve per documentare, simulare e sintetizzare. Un blocco ha una entity (nome e porte in/out) e almeno una architecture (cosa c'è dentro: structural con component e port map, dataflow con equazioni booleane, behavioral con comportamento). Tipi: std_logic (da 1164: '0','1','X','Z','U','-',...), std_logic_vector, bit, boolean, integer. Signal per i collegamenti interni, constant per i valori fissi.Introduzione al VHDL - entity, architecture, tipi e livelli di descrizione →). - Errori: overflow letto dal solo riporto; complemento a 2 senza il ; scritto come (è segno e modulo: in complemento a 2 è ); creduto rappresentabile.
- Sottrazione senza segno con prestito: in ogni colonna con prestito si aggiunge 2 alla cifra. Esempio: , letto dal bit 0 al bit 4 con cifre e prestiti tra le colonne 0, 1 e 2.
- Complemento a 2 su 4 bit: , , , , .
- Esempi a 8 bit: ; (si inverte e si somma 1); .
- Addizionatore-sottrattore: un segnale fa XOR su ogni bit di e diventa il riporto in ingresso del primo full adder: somma, sottrae.
- Overflow, esercizi: su 6 bit () non ha overflow e dà ; su 7 bit () ha overflow, perché .
- Estensione del segno: si replica l'MSB, così il valore non cambia.