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
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.
| 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.
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 |
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 : .
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 |
|---|---|---|---|
Sottrazione: , cioè si somma ad il complemento a 2 di : (complemento a 1 di più 1). Esempio: : , il suo complemento a 2 è (), e ✓.
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.
Numeri con segno (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: 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
- Senza segno: con prestito in uscita (se ): risultato sbagliato; valore corretto ().
- Complementi: a 1 (inversione); a 2 a 1 (). .
- Segno e modulo: due zeri, intervallo simmetrico. Complemento a 2: un zero, da a , MSB peso (); ; estensione del segno.
- Somma: si sommano tutti i bit, riporto in uscita scartato; sottrazione: (XOR con e ). Es. : .
- Overflow: senza segno (somma) ; con segno (stesso segno degli addendi, segno opposto nel risultato); segno diverso mai overflow. (); ().
- VHDL:
signed(a)+signed(b);v <= (a(7) xnor b(7)) and (a(7) xor sum(7))(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 →). - Errori: overflow letto dal solo riporto; complemento senza ; (è segno-modulo).