codi ca binaria - valente.dei.polimi.itvalente.dei.polimi.it/materiale/esercitazioni/c/codifica...
TRANSCRIPT
Esercizio 1)
Un tuo amico ha calcolato che -77 ha rappresentazione 101001101, ma non si ricorda quale codi�ca ha usato
tra:
• binario naturale
• rappresentazione modulo e segno.
• complemento a 2
Sapresti aiutarlo mostrandogli come si rappresenta -77 nelle diverse codi�che?
Soluzione
Binario naturale: 28 + 26 + 23 + 22 + 1 = 256 + 64 + 8 + 4 + 1 = 333, non è la codi�ca usata.
Modulo e segno: Bit segno = 1 =⇒ numero negativo. Modulo: 64 + 8 + 4 + 1 = 77; Quindi vale −77. E' la
codi�ca usata dal mio amico
C2: −bn2n−1 + bn−12n−2 + ...+ b1 = −256 + 64 + 8 + 4 + 1 = −179. Non è la codi�ca usata dal mio amico.
2
Esercizio 2)
Data la seguente sequenza di bit: 1100 0011 1111 0101 1100 1100 0000 0000
(1) La si converta in esadecimale
(2) La si converta in decimale usando:
(a) La codi�ca �xed point (20 bit per la parte intera)
(b) La codi�ca �oating point single precision
(c) La codi�ca binaria naturale
(d) La codi�ca binaria intera C2
Soluzione:
(1) Conversione esadecimale:
1100 0011 1111 0101 1100 1100 0000 0000 Binario
12 3 15 5 12 12 0 0
C 3 F 5 C C 0 0 HEX
(2) Conversione decimale:
(a) Sappiamo che nalla conversione �xed point si una il C2. Consideriamo i primi 20 bit e ne calcoliamo
l'equivalente decimale:
11 00 00 11 11 11 01 01 11 00=
= −219 + 218 + 213 + 212 + 211 + 210 + 29 + 28 + 26 + 24 + 23 + 22 = −245924
i bit restanti daranno la parte frazionaria:
11 00 00 00 00 00=0,75
2−1 + 2−2 = 0, 75
In conclusione: -245924+0,75=-245923,25.
Analogamente si sarebbe giunti allo stesso risultato tramite il calcolo:
11000011111101011100,110000000000 =
=11000011111101011100110000000000× 2−12 =
=(−231 + 230 + ...+ 210
)× 2−12 = −245923, 25.
3
SOLUZIONE: 4
(b)
S = 1 bit
E = e+K E (valore memorizzato) = e (esponente)−K
K = 127
M = 23 bit
S = −1;
e = (10000111)2 − (127)10 = 135− 127 = 8;
M = 11101011100110000000000 = 2−1 + 2−2 + 2−3 + 2−5 + 2−7 + 2−8 + 2−9 + 2−12 + 2−13 =
1, 9202880859375
R = −1× 28 × 1, 9202880859375 = −491, 59375
(c) 231 + 230 + 225 + 224 + 223 + 222 + 221 + 220 + 218 + 216 + 215 + 214 + 211 + 210 = 3287665664
(d) −231 + 230 + 225 + 224 + 223 + 222 + 221 + 220 + 218 + 216 + 215 + 214 + 211 + 210 = −1007301632
Esercizio 3)
Dato il numero in base 10:(−175, 45)10, si risponda ai seguenti quesiti:
(1) In caso si utilizzi la codi�ca �xed point su 16 bit
(a) Quanti bit devono essere dedicati alla rappresentazione di parte intera e decimale a�nché tale numero
sia rappresentabile correttamente?
(b) Si rappresenti il numero rispettando i vincoli trovati al punto (a)
(c) Quanto vale in decimale il valore calcolato? Perché?
(2) In caso si utilizzi la codi�ca in virgola mobile a precisione singola secondo lo standard IEEE 754-1985
(a) Si rappresenti il valore
(b) Quanto vale in decimale il valore calcolato? Perché?
Soluzione:
(1) Codi�ca �xed point:
(a) Il numero di bit da dedicare alla parte intera sarà pari a: ceil(log2 (175)) a cui andrà aggiunto
un bit per la il segno. Il numero minimo di bit per rappresentare la parte interea sarà quindi:
n = 1 + ceil(log2 (175)) = 1 + ceil(7, 4512...) = 1 + 8 = 9. 9 bit parte intera, 7 bit parte decimale.
(b) Scomponiamo il numero dato come somma di un numero intero e di un numero decimale a parte intera
nulla: −175, 45 = −(175) + (−(0, 45)). Procediamo ora alla codi�ca dei due numeri separatamente
per poi sommarli in binario alla �ne.
Codi�ca binaria in C2 su 9 bit di -175:
Se il numero è positivo:
- Calcolo il suo valore su n-1 bit (8 in questo caso) in binario naturale
- Aggiungo uno 0 a sinistra (che rappresenta il segno +)
Se il numero è negativo:
- Ne prendo il modulo:
- Inverto i bit (gli 1 diventano 0 e viceversa)
- Sommo 1 (che si scrive come n-1 zeri e un 1. ES: se n = 8bit =⇒ 00000001)
Procediamo con i passi appena descritti:
il numero è negativo, quindi ne valuto solamente il modulo (-175).
Calcolo la sua codi�ca in binario naturale su 8 bit:
5
SOLUZIONE: 6
175 : 2 = 87 resto 1
87 : 2 = 43 resto 1
43 : 2 = 21 resto 1
21 : 2 = 10 resto 1
10 : 2 = 5 resto 0
5 : 2 = 4 resto 1
4 : 2 = 2 resto 0
2 : 2 = 1 resto 0
Quindi 175 =⇒ 10101111 NB: I bit risutanti dalle divisioni si leggono dal basso verso l'alto. Il bit =
1 relativo alla divisione intera 175:2 è il bit più a destra nella codi�ca.
Proseguiamo con il C2.
- Aggiungo uno zero a sinistra: 010101111 (9 bit)
- Inverto i bit: 101010000
- Sommo uno 101010000 + 1 = 11010001 = 175 in codi�ca C2.
- Poiché il numero �nale deve avere 16 bit (9+7), scrivo già -175 con le 7 cifre decimali nulle (-175,0):
−175, 0 = 11010001, 00000000.
Codi�ca binaria in C2 su 7 bit di valore decimale di parte frazionaria -0,45:
I passi per convertire il numero -0.21 in binario C2 sono gli stessi di prima. Per la parte decimale
l'algoritmo prevede di moltiplicare per 2 (e non dividere, come prima) e associare a tale calcolo un
bit che ha come valore la parte intera del risultato della moltiplicazione.
0, 45× 2 = 0, 90 =⇒ 0
0, 90× 2 = 1, 80 =⇒ 1 sottraggo 1 =
0, 80× 2 = 1, 60 =⇒ 1 sottraggo 1 =
0, 60× 2 = 1, 20 =⇒ 1 sottraggo 1 =
0, 20× 2 = 0, 40 =⇒ 0
0, 40× 2 = 0, 80 =⇒ 0
0, 80× 2 = 1, 60 =⇒ 1
0,45 su 7 bit (valore approssimato, troncato a 7 bit) vale 01 (1100) 1. In questo caso i bit sono letti
dall'alto verso il basso.
Proseguiamo con il C2.
- Aggiungo uno zero a sinistra: 00111001 (8 bit)
- Inverto i bit: 11000110
- Sommo uno 11000110 + 1 = 11000111
Quindi, codi�ca binaria in C2 di -0,45 è 1,1000111 (approssimato)
SOLUZIONE: 7
Anche qui scriviamo il numero trovato su 16 bit: 111111111,1000111. Replicando in modo pro-
gressivo il bit di segno a sinistra il valore del numero non muta.
Sommo le due parti. −175, 45 = −175 + (−0, 45) Allineo e sommo parte intera e parte decimale
110100001, 0000000+
111111111, 1000111 =
101010000, 1000111
(c) Tale numero vale: −256 + 64 + 16 + 12 + 1
32 + 164 + 1
128 = −175, 4453125. Non corrisponde al numero
fornito nel testo del problema in quanto c'è stato troncamento delle cifre decimali dovuto alla codi�ca
�xed point (comunque inevitabile perché il numero era periodico).
(2) Codi�ca standard IEEE 754-1985
(a) Nella codi�ca standard IEEE 754-1985 single precision si hanno:
S = 1 bit
E = e+K e = E −K
K = 127
M = 23 bit
Calcolo parte intera e decimale del numero dato condiderandolo positivo: 1175,45 = 1010111,011(1001).
Porto il numero in forma canonica, ovvero con la mantissa compresa tra [1, 000... 1, 111...], =
=1, 01011110111001100110011× 27.
Calcolo tutti termini che compongono lo standard:
R = (−1)S ×M × 2e
S = 1
K = 127
E = e+K = 7 + 127 = 134 = 10000110 valore memorizzato
M = 23 bit
In conlusione, codi�ca standard IEEE 754-1985 di 101010000,1000111 =
= 1 10000110 01011110111001100110011
(b) Tale numero vale: R = (−1)S ×M × 2E−K con:
M = 2−2 +2−4 +2−5 +2−6 +2−7 +2−9 +2−10 +2−11+2−14 +2−15 +2−18 +2−19+2−22 +2−23 =⇒
−1× 1, 370703101...× 27 = −175, 4499969.
Non corrisponde al numero fornito nel testo del problema in quanto c'è stato troncamento del numero
(inevitabile anche perché il numero era periodico).
Esercizio 4)
Calcolare codi�ca in virgola mobile Standard IEEE 754-1985 a precisione singola del numero -123,21.
Soluzione
La rappresentazione in virgola mobile si basta sulla notazione scienti�ca: R = (−1)S ×M × 2e con:
S 1 bit di segno
E = e+K 8 bit esponente in rappresentazione "eccesso K"
K = 127
M 23 bit mantissa scritta in forma canonica 1,xxxxxxxxx
per un totale di 32 bit.
Nel nostro caso S = 1, perchè -123,21 è negativo. Sistemato il segno lavoriamo quindi con 123.21.
Codi�chiamo parte intera e decimale separatamente.
Si noti che in virgola mobile non si hanno vincoli di bit per la rapprsentazione di parte intera e decimale. I
limiti vengono introdotti solo alla �ne perché abbiamo 32 bit, ma non occorre valutare tali limiti durtante calcoli.
Per esempio, per rappresentare 123, quanti bastano 7 bit, quindi, 123 lo scivo su 7 bit: 123 =⇒ 1111011. Se avessi
dovuto rappresentare 987 sarebbero serviti 10 bit, e avrei scritto 987 su 10 bit. In questo senso non c'è un vincolo
al momento dei calcoli.
Ecco invece le operazioni per codi�care 0.210000:
8
SOLUZIONE 9
1) 0.210000× 2 = 0.420000 =⇒ 0 19) 0.240000× 2 = 0.480000 =⇒ 0
2) 0.420000× 2 = 0.840000 =⇒ 0 20) 0.480000× 2 = 0.960000 =⇒ 0
3) 0.840000× 2 = 1.680000 =⇒ 1 21) 0.960000× 2 = 1.920000 =⇒ 1
4) 0.680000× 2 = 1.360000 =⇒ 1 22) 0.920000× 2 = 1.840000 =⇒ 1
5) 0.360000× 2 = 0.720000 =⇒ 0 23) 0.840000× 2 = 1.680000 =⇒ 1
6) 0.720000× 2 = 1.440000 =⇒ 1 24) 0.680000× 2 = 1.360000 =⇒ 1
7) 0.440000× 2 = 0.880000 =⇒ 0 25) 0.360000× 2 = 0.720000 =⇒ 0
8) 0.880000× 2 = 1.760000 =⇒ 1 26) 0.720000× 2 = 1.440000 =⇒ 1
9) 0.760000× 2 = 1.520000 =⇒ 1 27) 0.440000× 2 = 0.880000 =⇒ 0
10) 0.520000× 2 = 1.040000 =⇒ 1 28) 0.880000× 2 = 1.760000 =⇒ 1
11) 0.040000× 2 = 0.080000 =⇒ 0 29) 0.760000× 2 = 1.520000 =⇒ 1
12) 0.080000× 2 = 0.160000 =⇒ 0 30) 0.520000× 2 = 1.040000 =⇒ 1
13) 0.160000× 2 = 0.320000 =⇒ 0 31) 0.040000× 2 = 0.080000 =⇒ 0
14) 0.320000× 2 = 0.640000 =⇒ 0 32) 0.080000× 2 = 0.080000 =⇒ 0
15) 0.640000× 2 = 1.280000 =⇒ 1 33) 0.080000× 2 = 0.320000 =⇒ 0
17) 0.560000× 2 = 1.120000 =⇒ 1 34) 0.320000× 2 = 0.640000 =⇒ 0
18) 0.120000× 2 = 0.240000 =⇒ 0 35) 0.640000× 2 = 1.280000 =⇒ 1
...si potrebbe andare avanti visto che il risultato della moltiplicazione non ha ancora fatto 1.
Quindi 0.21 =⇒ 001101011100001010001111010111000 anche qui non mi pongo limiti per ora.
Uniamo le due parti trovate: 1111011,001101011100001010001111010111000 e otteniamo M, che però non è
ancora scritto in forma canonica.
Al �ne di arrivare a scrivere il numero nella forma desiderata M × 2E , spostiamo la virgola verso dx o verso sx
al �ne di avere M scritto nella forma 1,xxxxxx. In questo caso spostiamo di 6 a sx, e moltiplichiamo quindi per 26.
REGOLA: (come in decimale) sposto la virgola verso SX =⇒ esponente positivo. Sposto la virgola verso DX =⇒
esponente negativo
In un colpo solo abbiamo quindi M scritta correttamente ed E che è però ancora in decimale (NB: se non sono
necessari spostamenti, ovviamente E = 0).
Abbiamo quindi: 1, 111011001101011100001010001111010111000× 26
Codi�chiamo l'esponente. E va codi�cata su 8 bit in binario naturale. Al �ne di poter ottenere anche esponenti
negativi (per numeri 0 < x < 1) non si codi�ca l'esponente trovato direttamente ma lo si fa in eccesso K: E = e+K,
K=127. Nel nostro caso l'esponente è 6, quindi codi�chiamo: E = 6 + 127 = 133 = 10000101.
Per cui:
M = 1, 111011001101011100001010001111010111000
E = 10000101
SOLUZIONE 10
Abbiamo tutto:S E M
1 10000101 11101100110101110000101
Per la mantissa non ho preso l'1 prima della virgola, perché lo standard prevede che la mantissa sia scritta
come 1,xxx quindi perché scrivere 1,? Infatti lo si omette e si guadagna un bit di precisione.
(E' un po' come lo 0 prima dei pre�ssi dei cellulari. Un bel giorno han detto: ma che diamine, tutti i pre�ssi
iniziano con 0, quindi... perché far comporre lo 0 all'utente? E infatti ora lo zero non c'è più...)
Sempre sulla mantissa ho preso solo le prime 23 cifre dopo la virgola tra quelle che ho trovato coi calcoli (che
erano molte di più).
Esercizio 5)
Dato il numero: -221,0625 se ne calcoli:
(1) la rappresentazione in virgola �ssa su 14 bit (8 parte intera, 6 parte decimale)
(2) la rappresentazione in virgola mobile secondo lo standard IEEE 754-1985 a precisione singola.
Soluzione
(1) Non è possibile rappresentare tale numero correttamente perché 8 bit di parte intera in C2 possono
rappresentare l'intervallo di numeri interi da -128 a 127.
(2)
221 = 11011101
0, 065 = 0, 0001
121, 0625 = 11011101, 0001 = 1, 10111010001× 27S = 1 1 bit di segno
E = e+K = 7 + 127 = 134 = 10000110 8 bit esponente in rappresentazione "eccesso K"
M = (1, )10111010001(+12zeri) 23 bit mantissa scritta in forma canonica 1,xxxxxxxxx
Risultato codi�ca:S E M
1 10000110 10111010001000000000000
11
Esercizio 6)
Dato il seguente numero decimale: -491,578125 si risponda ai seguenti quesiti:
(1) Si codi�chi tale numero in virgola �ssa su 14 bit, 10 per la parte intera, 4 per quella decimale
(2) Si codi�chi tale numero in virgola mobile, precisione singola
(3) Si riconvertano in decimale i valori ottenuti ai punti (1) e (2). Cosa si può dire?
Soluzione:
(1) Scomponiamo il numero dato come somma di un numero intero e di un numero decimale a parte intera
nulla: −491, 578125 = −(491)+(−(0, 578125)). Procediamo ora alla codi�ca dei due numeri separatamente
per poi sommarli in binario alla �ne.
Codi�ca binaria in C2 su 10 bit di -491: Il numero è negativo, ne valuto solamente il modulo e calcolo
la sua codi�ca in binario naturale su n-1 bit (9 in questo caso):
491 : 2 = 245 resto 1
245 : 2 = 122 resto 1
122 : 2 = 61 resto 0
61 : 2 = 30 resto 1
30 : 2 = 15 resto 0
15 : 2 = 7 resto 1
7 : 2 = 3 resto 1
3 : 2 = 1 resto 1
1
Quindi 491 =⇒ 111101011.
Proseguiamo con il C2.
- Aggiungo uno zero a sinistra: 0111101011 (10 bit)
- Inverto i bit e sommo 1: 1000010100 + 1 = 1000010101 = −491 in codi�ca C2
- Poiché il numero �nale deve avere 14 bit (10+4), scrivo: −491, 0 = 1000010101, 0000.
12
SOLUZIONE: 13
Codi�ca binaria in C2 su 4 bit di -0,578125:
0, 578125× 2 = 1, 15625 =⇒ 1 sottraggo 1 =
0, 15625× 2 = 0, 3125 =⇒ 0
0, 3125× 2 = 0, 625 =⇒ 0
0, 625× 2 = 1, 25 =⇒ 1 sottraggo 1 =
0, 25× 2 = 0, 5 =⇒ 0
0, 5× 2 = 1 =⇒ 1 �ne conversione
0× 2 = 0 =⇒ 0
0,578125 su 4 bit (valore approssimato, troncato a 4 bit) vale 1001.
Proseguiamo con il C2.
- Aggiungo uno zero a sinistra: 01001 (5 bit)
- Inverto i bit e sommo 1: 10110 + 1 = 10111
La codi�ca binaria in C2 di -0,578125 è 1,0111 (approssimato). Scrivo il numero trovato su 14 bit:
1111111111,0111.
Sommo le due parti. −491, 578125 = −491 + (−0, 578125)
1000010101, 0000+
1111111111, 0111 =
1000010100, 0111
(2) Dai calcoli precedenti abbiamo già la codi�ca dei parte intera e parte decimale in codi�ca binaria:
491 = 111101011
0, 578125 = 100101
491, 578125 = 111101011, 100101 porto il numero in forma canonica: 1, 11101011100101× 28S = 1 1 bit di segno
E = e+K = 8 + 127 = 135 = 10000111 8 bit esponente in rappresentazione "eccesso K"
M = 11101011100101000000000 23 bit mantissa
Rsultato codi�ca:S E M
1 10000111 11101011100101000000000
(3) Fixed point: 1000010100, 0111 = 10000101000111×2−4 = −7865×2−4 = 491, 5625 (troncato per mancanza
cifre decimali)
(4) Floating point: 1 10000111 11101011100101000000000 =(−1)S×2e×M = −1×28×1, 92022705078125 =
−491, 578125 OK!
Esercizio 7)
(1) Indicare quanti sono i bit necessari per assegnare un codice binario univoco a ciascuno dei 23 milioni di
veicoli che circolano in Italia.
(2) Riportare la codi�ca in binario (senza segno) dei numeri: (+134)10 e (+87)10. In entrambi i casi utilizzare
il numero minimo di bit.
Soluzione
(1) Numero di autoveicoli N = 26× 106, il numero di bit necessario sarà quindi: n = ceil(log2
(26× 106
))=
ceil (24, 6320) = 25 bit.
(2) Conversione binaria:
(a) Numero minimo di bit n = ceil(log2 (134)) = ceil(log2 (7, 0661)) = 8 bit.
134 : 2 = 67 resto 0
67 : 2 = 33 resto 1
33 : 2 = 16 resto 1
16 : 2 = 8 resto 0
8 : 2 = 4 resto 0
4 : 2 = 2 resto 0
2 : 2 = 1 resto 0
1
(134)10 = (10000110)2
(b) Numero minimo di bit n = ceil(log2 (87)) = ceil(log2 (6, 4429)) = 7 bit.
87 : 2 = 43 resto 1
43 : 2 = 21 resto 1
21 : 2 = 10 resto 1
10 : 2 = 5 resto 0
5 : 2 = 2 resto 1
2 : 2 = 1 resto 0
1
(87)10 = (1010111)2
14
Esercizio 8)
(1) Indicare quanti sono i bit necessari per rappresentare in C2 i numeri A = (+129)10 e B = (−271)10.
(2) Riportare la codi�ca in binario dei due numeri utilizzando lo stesso numero minimo di bit.
Soluzione
(1) n = 1 + dlog2max {|A| , |B|}e = 1 + dlog2 (271)e = 1 + dlog2 (8, 0821)e = 10 bit.
In C2 sappiamo che con n bit abbiamo un intervallo rappresentabile di valori pari a: I =[−2n−1, 2n−1 − 1
].
Nel nostro caso l'ntervallo corrisponde a: I =[−210−1, 210−1 − 1
]= [−512,+511].
(2) Conversione binaria:
(a) A = (+129)10
129 : 2 = 64 resto 1
64 : 2 = 32 resto 0
32 : 2 = 17 resto 0
17 : 2 = 8 resto 0
8 : 2 = 4 resto 0
4 : 2 = 2 resto 0
2 : 2 = 1 resto 0
1
(129)10 = (10000001)2
C2: il numero è positivo:
- Aggiungo uno zero a sinistra: 010000001
(b) B = (−271)10271 : 2 = 135 resto 1
135 : 2 = 67 resto 1
67 : 2 = 33 resto 1
33 : 2 = 16 resto 1
16 : 2 = 8 resto 0
8 : 2 = 4 resto 0
4 : 2 = 2 resto 0
2 : 2 = 1 resto 0
1
(271)10 = (100001111)2
15
SOLUZIONE 16
C2: il numero è negativo:
- Aggiungo uno zero a sinistra: 0100001111
- Inverto i bit e sommo 1: 1011110000 + 1 = (1011110000)C2.
Esercizio 9)
Eseguire le seguenti conversioni di base tra i numeri positivi:
(1) (27376)8 in binario
(2) (110111)2 in hex
(3) (5ABF )16 in oct
(4) (1274)10 in hex
(5) (FE2A)16 in binario
Soluzione
(1) (27376)8:2 7 3 7 6 oct
010 111 011 111 110 bin
(2) (110111)2:0011 0111 bin
3 7 hex
(3) (5ABF )16:5 A B F hex
0101 1010 1011 1111 bin=
101 101 010 111 111 bin
5 5 2 7 7 oct
(4) (1274)10:
1274 : 16 = 79 resto 10 =⇒ A
79 : 16 = 4 resto 15 =⇒ F
4 resto 4 =⇒ 4
(1274)10 = (4FA)16
(5) (FE2A)16:F E 2 A hex
1111 1110 0010 1010 bin
17
Esercizio 10)
Dato il numero decimale x = 17, 125 determinare la sua rappresentazione in virgola �ssa indicando il minimo
numero di bit necessario per rappresentarlo in modulo e segno.
Soluzione
Codi�co parte intera e parte decimale separatamente:
parte intera = 17
17 : 2 = 8 resto 1
8 : 2 = 4 resto 0
4 : 2 = 2 resto 0
2 : 2 = 1 resto 0
1
(17)2 = (10001)2
parte frazionaria = 0,125
0, 125× 2 = 0, 25 =⇒ 0
0, 25× 2 = 0, 5 =⇒ 0
0, 5× 2 = 1 =⇒ 1 �ne conversione
(0, 125)2 = (0.001)2
x = (0)10001, 001, n = 9bit.
18
Esercizio 11)
Convertire in base 10 i seguenti numeri espressi C2 su n = 8 bit:
(1) N = (10011010)C2
(2) M = (01111111)C2
Soluzione
(1) N = (10011010)C2 = −27 + 24 + 23 + 21 = (−102)10Veri�ca:
102 : 2 = 51 resto 0
51 : 2 = 25 resto 1
25 : 2 = 12 resto 1
12 : 2 = 6 resto 0
6 : 2 = 3 resto 0
3 : 2 = 1 resto 1
1
(102)10 = (1100110)2
Il numero è negativo:
- Aggiungo uno zero a sinistra: 01100110
- Complemento e sommo 1: 10011001 + 1 = (10011010)C2 = N .
(2) M = (01111111)C2 = 26 + 25 + 24 + 23 + 22 + 21 + 20 = (+127)10
19
Esercizio 12)
Sia n = 5, trovare la codi�ca in C2 dei seguenti numeri:
(1) A=-1
(2) B=-16
(3) E=15
(4) D=10
Soluzione
(1) A < 0 =⇒ AC2 = 2n − |A| = 100000− 00001 = ((1) 1111)C2
(2) B < 0 =⇒ BC2 = 2n − |B| = 100000− 01000 = ((1) 0000)C2
(3) E > 0 =⇒ EC2 = ((0) 1111)C2
(4) D > 0 =⇒ DC2 = ((0) 1010)C2
20
Esercizio 13)
Si consideri una rappresentazione in C2 su n = 4 bit. Dire in quali casi si veri�ca over�ow e se il risultato delle
somme è corretto.
1. (+2)10 + (+5)10 4. (−5)10 + (−4)102. (+2)10 + (+6)10 5. (+5)10 + (+7)10
3. (−2)10 + (−4)10 6. (+2)10 + (−4)10
Soluzione
Sappiamo che in complemento a 2, con 4 bit abbiamo un intervallo di rappresentazione pari a: I =[−24−1; 24−1 − 1
]=
[−8; 7] ,quindi, tutti i numeri elencati sono correttamente rappresentabili. In C2, inoltre, si ha over�ow quando il
risultato corretto dell'addizione eccede il potere di rappresentazione dei bit a disposizione.
Si può avere over�ow senza riporto perduto e capita quando da due addendi positivi otteniamo un risultato
negativo (Es: +2+6).
Si può avere un riporto perduto senza over�ow e capita quando due addendi discordi generano un risultato
positivo (Es: +12-7).
Un semplice modo per rilevare l'over�ow in C2 è:
• se gli addendi sono tra loro discordi, non si veri�ca mai;
• se gli addendi sono tra loro concordi, si veri�ca se e solo se il risultato è discorde.
(1)
(+2)10 : 0010
(+5)10 : 0101
0111
NO over�ow. Risultato corretto.
(2)
(+2)10 : 0010
(+6)10 : 0110
1000
Addendi concordi ma risultato discorde, over�ow senza riporto perduto. Risultato
errato: −8 6= 2 + 6.
(3)
(−2)10 : 1110
(−4)10 : 1100
[1]1010
NO over�ow. Risultato corretto.
21
SOLUZIONE 22
(4)
(−5)10 : 1011
(−4)10 : 1100
0111
Addendi concordi ma risultato discorde, over�ow con riporto perduto. Risultato er-
rato: +7 6= −5− 4.
(5)
(−5)10 : 1011
(+7)10 : 0111
[1]0010
NO over�ow. Risultato corretto.
(6)
(+2)10 : 0010
(−4)10 : 1100
1110
NO over�ow. Risultato corretto.
Esercizio 14)
Si calcoli la somma (A+B) dei seguenti numeri in C2 ciascuno di 6 bit. Si determini anche se si veri�ca
trabocco oppure no.
(1) A = (100001)C2
(2) B = (100010)C2
Soluzione
A : 100001 +
B : 100010 =
000011
Over�ow. Il risultato non è corretto perchè il bit più signi�cativo della somma è diverso
dai bit più signi�cativi degli addendi.
Veri�ca: A = −32 + 1 = −31; B = −32 + 2 = −30; A+B = −61 /∈ I = [−32,+31]
23