codi ca binaria - valente.dei.polimi.itvalente.dei.polimi.it/materiale/esercitazioni/c/codifica...

24

Upload: vuongkhanh

Post on 17-Jul-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

Codi�ca binaria

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

Esercizio 15)

Si calcoli la di�erenza (A−B) dei seguenti numeri in C2 ciascuno di 6 bit. Si determini se si veri�ca trabocco

oppure no.

(1) A = (010111)C2

(2) B = (111010)C2

Soluzione

A+B = A+ (−B). −B = 010111 + 1 = 000110

A : 010111 +

−B : 000110 =

011101

No over�ow. Il risultato corretto.

24