Salta al contenuto
Note per Studenti Esercizio 4 · somme in complemento a 2, overflow e flag (temi d'esame gennaio 2023, luglio 2026 e esempi di prova)

Esercizio 4somme in complemento a 2, overflow e flag (temi d'esame gennaio 2023, luglio 2026 e esempi di prova)

Esame
In questa pagina 5

Testo (tema d'esame gennaio 2023, problema P4; esempio d'appello 2020-21, problema 2; prove del 2004; luglio 2026, problema 6).

(i) In una aritmetica a virgola fissa a 8 bit si eseguono le somme dei seguenti numeri decimali, rappresentati come interi con segno: (55+121)−82(55+121)-82. Determinare (a) il risultato delle due somme indicate; (b) quante volte si attiva il flag di overflow del processore; (c) quanto indicato ai punti precedenti se l'ordine diventa (121−82)+55(121-82)+55.

(ii) Si consideri il formato 2.6 su 8 bit (complemento a 2). Eseguire e dare il risultato in decimale: 01101011+1001011001101011+10010110, 01111110+1000000001111110+10000000, 10001111−0110011010001111-01100110. Dire se c'è overflow.

(iii) Sommare i numeri esadecimali a 8 bit in complemento a 2 73+CA\texttt{73}+\texttt{CA} e 7F+80\texttt{7F}+\texttt{80} e riportare il risultato in decimale.

(iv) Indicare vero o falso: a. l'overflow di una somma viene sempre segnalato dalla ALU; b. lo stato della ALU è descritto dai bit di un registro apposito; c. in ogni istante il program counter punta la locazione dell'istruzione in esecuzione; d. il vettore delle eccezioni è un altro dei registri essenziali di una ALU; e. nessuna ALU può essere priva di un circuito moltiplicatore; f. alcuni microcontrollori a basso costo sono privi di ALU.


Teoria usata: Numeri binari e complemento a dueI processori lavorano con un numero fisso di bit $n$. I naturali vanno da $0$ a $2^n-1$; per i negativi si usa il complemento a due: $C_2(N)=2^n-N=\overline N+1$ (si invertono tutti i bit e si somma 1). Con $n$ bit rappresenta $-2^{n-1}\le N\le2^{n-1}-1$, ha un solo zero e unifica somma e sottrazione. Quando il risultato esce dall'intervallo c'è overflow; gli overflow intermedi si compensano se il risultato finale è rappresentabile. La lunghezza di parola non è l'accuratezza.Numeri binari e complemento a due →, ALU - sommatore, overflow, carry look-ahead e shiftL'ALU è un insieme di celle a 1 bit (full adder + selettori) collegate in parallelo: somma, sottrae ($A-B=A+\overline B+1$: si inverte $B$ e si porta il riporto iniziale a 1), fa AND/OR. Il ritardo è dominato dal riporto: nel ripple-carry cresce linearmente con i bit; col carry look-aheadtecnica che calcola in anticipo i riporti da generazione e propagazione, riducendo il ritardo i riporti si calcolano da generazione $g_i=A_iB_i$ e propagazione $p_i=A_i+B_i$ in pochi livelli di logica. L'overflow è $V=C_{in,n-1}\oplus C_{out,n-1}$. Gli shift logici inseriscono 0, gli aritmetici estendono il segno; il barrel shiftercircuito che sposta una parola di un numero qualsiasi di posizioni in un solo ciclo sposta di $m$ posti in un ciclo.ALU - sommatore, overflow, carry look-ahead e shift →, Virgola fissa - formati n.m e normalizzazioneIn virgola fissa il processore fa aritmetica sugli interi (con segno) e il fattore di scalacostante per cui si moltiplica un valore reale per ottenere l'intero memorizzato $2^{m}$ resta sottinteso: il formato n.m dice che dei bit disponibili $n$ sono la parte intera (compreso il segno se il numero è con segno, S; nessun segno se U) e $m$ la parte frazionaria. Il valore è $\text{codice}/2^m$. Passare dal formato n.m al decimale, o viceversa, è il calcolo più frequente dell'esame: su 16 bit $\text{valore}=\text{codice}/2^m$, l'intervallo è $[0,2^n)$ (U) oppure $[-2^{n-1},2^{n-1})$ (S), la risoluzione è $2^{-m}$.Virgola fissa - formati n.m e normalizzazione →.

(i) Ordine delle somme

Con 8 bit con segno l'intervallo è [−128,127][-128,127].

(55+121)−82(55+121)-82. Prima somma: 55+121=176>12755+121=176>127: overflow (due positivi danno un negativo): su 8 bit 176−256=−80176-256=-80 (0xB0\texttt{0xB0}). Nell'ultima cella il riporto in ingresso è 1 e quello in uscita è 0: V=Cin⊕Cout=1V=C_{in}\oplus C_{out}=1. Seconda operazione: −80−82=−80+(−82)-80-82=-80+(-82); −82=0xAE-82=\texttt{0xAE}: 0xB0+0xAE=0x15E→0x5E=94\texttt{0xB0}+\texttt{0xAE}=\texttt{0x15E}\to\texttt{0x5E}=94. Due negativi hanno dato un positivo: di nuovo overflow (Cin=0C_{in}=0, Cout=1C_{out}=1). Il risultato finale è 9494, corretto (176−82=94176-82=94, rappresentabile): per la circolarità del complemento a 2 gli overflow intermedi si compensano. Il flag di overflow si attiva 2 volte.

(121−82)+55(121-82)+55. 121−82=39121-82=39 (positivo meno positivo: nessun overflow, V=0V=0: segni opposti dopo la negazione di 82); 39+55=9439+55=94, nessun overflow. Risultato 94, 0 volte il flag.

Riassunto: stesso risultato (94), ma nel primo ordine il flag si accende due volte. Un overflow non compensato renderebbe invece il risultato errato: per esempio 121+55=176121+55=176 come risultato finale su 8 bit è −80-80 (errato) e il flag segnala il problema.

(ii) Formato 2.6

Il formato 2.6 su 8 bit ha intervallo [−2,2)[-2,2) e risoluzione 164\frac1{64}.

  • 01101011=10701101011=107, cioè 1,6721{,}672; 10010110=−10610010110=-106 (cioè −1,656-1{,}656). Somma: 107−106=1→00000001=164=0,0156107-106=1\to00000001=\frac1{64}=\mathbf{0{,}0156}. Segni opposti: nessun overflow.
  • 01111110=12601111110=126 (1,9691{,}969); 10000000=−12810000000=-128 (−2,0-2{,}0): somma −2=11111110=−0,03125-2=11111110=\mathbf{-0{,}03125}. Segni opposti: nessun overflow.
  • 10001111=−11310001111=-113 (−1,766-1{,}766) meno 01100110=10201100110=102 (1,5941{,}594): −113−102=−215-113-102=-215, fuori da [−128,127][-128,127]: overflow. Il risultato nel circuito è −215+256=41=00101001=0,6406-215+256=41=00101001=\mathbf{0{,}6406}, errato (il valore vero è −215/64=−3,359-215/64=-3{,}359, non rappresentabile in 2.6). In termini di riporti: nell'ultima cella Cin=0C_{in}=0 e Cout=1C_{out}=1, V=1V=1.

(iii) Somme esadecimali

73=115\texttt{73}=115 e CA=−54\texttt{CA}=-54: 115−54=61115-54=\mathbf{61} (0x3D\texttt{0x3D}), nessun overflow. 7F=127\texttt{7F}=127 e 80=−128\texttt{80}=-128: 127−128=−1127-128=\mathbf{-1} (0xFF\texttt{0xFF}), nessun overflow (segni opposti). In decimale (con le tabelle del 2004): 01010111+11011010=87−38=4901010111+11011010=87-38=49; 01111110+10000001=126−127=−101111110+10000001=126-127=-1.

(iv) Vero o falso

Errori comuni

  • Dire che l'overflow intermedio rende errato il risultato finale quando questo è rappresentabile.
  • Cercare overflow con operandi di segno opposto (non si verifica mai in una somma).
  • Confondere riporto uscente e overflow: l'overflow è lo XOR dei riporti in ingresso e in uscita dall'ultima cella.
  • Interpretare i bit del formato 2.6 come interi nel risultato finale (dividere per 64 dopo la somma).

Versione ripasso

Testo. Somme in complemento a 2 a 8 bit con conteggio degli overflow e formato 2.6 (gennaio 2023, prove 2004 e 2020-21, luglio 2026).

Teoria collegata