Rappresentazione Binaria di Numeri Interi e in Virgola

Rappresentazione Binaria di Numeri Interi e in Virgola Giuseppe Vizzari Codifica numeri naturali •  I numeri interi senza segno, ossia i numeri Naturali incluso lo 0, vengono rappresenta= a>raverso la loro conversione in binario su N bit •  L’algoritmo di conversione è il seguente: –  Si divide il numero da conver=re per 2 –  Si riporta il risultato della divisione ed il resto della divisione –  Si ripete il procedimento fino a quando il risultato diviene 0 •  Il numero binario è cos=tuito da tuG i res= presi da quello o>enuto per ul=mo a quello o>enuto per primo Conversione naturale à binario (1) Esempio: si converta in binario il numero 8 8:2= 4 resto 0 Bit meno significa=vo (LSB) 4:2= 2 resto 0 2:2= 1 resto 0 1:2= 0 resto 1 Bit più significa=vo (MSB) Il numero binario corrispondente a 8 è: 1 0 0 0 Conversione naturale à binario (2) Esempio: si converta in binario il numero 71 71:2= 35 resto 1 Bit meno significa=vo (LSB) 35:2= 17 resto 1 17:2= 8 resto 1 8:2= 4 resto 0 4:2= 2 resto 0 2:2 = 1 resto 0 1:2 = 0 resto 1 Bit più significa=vo (MSB) Il numero binario corrispondente a 71 è: 1 0 0 0 1 1 1 Conversione binario à naturale •  La conversione da binario a naturale, si effe>ua partendo dal bit meno significa=vo a quello più significa=vo, mol=plicando ogni bit per la 2 elevato alla posizione del bit: d N-1 x2 N-1 + d N-2 x2 N-2 + d N-3 x2 N-3 +..... + d1 x21 + d0 x2 0
•  Esempio: 100101011010100b à 1x215 +1x211 +1x29 +1x27 +1x26 +1x24 +1x22 +0x20 = 35.540
Limi= codifica naturale in binario •  Il più piccolo numero codificabile è banalmente 0 •  Il più grande numero codificabile dipende dal numero di bit N, ovvero 2N-­‐1 –  Se N=8 à 255 –  Se N=16 à 65535 –  Se N=32 à 4.294.967.295 Codifica esadecimale Decimale
Binario
Esadecimale
0
0000
0
1
0001
1
2
0010
2
3
0011
3
4
0100
4
5
0101
5
6
0110
6
7
0111
7
8
1000
8
9
1001
9
10
1010
A
11
1011
B
12
1100
C
13
1101
D
14
1110
E
15
1111
F
•  La codifica esadecimale viene a volte usata al posto della binaria per maggior compa>ezza di scri>ura •  Il numero binario viene suddiviso in blocchi di 4 bit a par=re dal meno significa=vo •  Ad ogni gruppo viene sos=tuito il simbolo esadecimale corrispondete Codifica esadecimale •  Ad esempio: 1000 1010 1101 0101 –  0101à5 –  1101àD –  1010àA –  1000à8 •  Diventa: 8AD5 Codifica numeri interi rela=vi •  I numeri interi rela=vi possono essere rappresenta= in due modi: –  Modulo e segno –  Complemento a 2 •  Differiscono sia nell’approccio che nelle cara>eris=che prestazionali •  La più u=lizzata è il complemento a 2 Codifica modulo e segno •  I numeri interi rela=vi sono rappresenta= in modo analogo a quanto fa>o per i numeri senza segno, riservando 1 bit per rappresentare il segno •  Si sceglie il bit più significa=vo per il segno –  Se il bit vale 1 allora il segno rappresentato è il – –  Se il bit vale 0 allora il segno è il + •  Il numero di bit u=li per rappresentare il valore assoluto del numero intero rela=vo è quindi: N-­‐1 Codifica modulo e segno •  Esempio: si voglia conver=re il numero -­‐5 con 8 bit –  Il primo bit (quello più significa=vo) viene posto a 1 perchè il numero è nega=vo –  gli altri 7 bit si calcolano con il metodo visto prima applicato al numero 5, o>enendo 0000101. –  Dunque il numero binario che rappresenta -­‐5 è: 10000101 Codifica complemento a 2 •  La rappresentazione in complemento a 2 di un numero intero rela=vo su N bit, si effe>ua nella seguente maniera: –  i numeri interi posi=vi (incluso lo zero) sono rappresenta= in modulo e segno u=lizzando gli N bit: •  1 bit di segno (il MSB, pari a 0) e N-­‐1 bit per la codifica –  i numeri interi nega=vi sono rappresenta= realizzando il complemento a 2 della codifica binaria su N bit del valore assoluto Codifica complemento a 2 •  Cosa è il complemento a 2 di un numero binario ? •  Dato un numero binario di N bit, il complemento a 2 di tale numero si oGene tramite il seguente algoritmo: –  si procede dal bit meno significa=vo verso quello più significa=vo –  finchè si incontrano bit di valore 0 ques= vengono lascia= inaltera= –  il primo bit di valore 1 viene lasciato inalterato –  tuG i bit successivi ad esso vengono nega= Esempi di complemento a 2 •  Esempio: si determini il complemento a 2 del numero 10100. –  TuG i bit 0 a par=re dal bit meno significa=vo sono lascia= inaltera= e così anche il primo bit 1. –  TuG gli altri bit vengono inver==, o>enendo: 01100. •  Esempio: si determini il complemento a 2 del numero 01101001. –  In questo caso non esistono bit 0 a par=re dal bit meno significa=vo. –  Solo il primo bit 1 viene lasciato inalterato. –  Gli altri vengono inver==, o>enendo: 10010111. Esempi di codifica complemento a 2 •  Esempio: si voglia conver=re il numero 1 con 8 bit –  Essendo il numero posi=vo: segno 0 –  Codifica binaria su 7 bit di 1: 0000001 –  Codifica complessiva: 00000001 •  Esempio: si voglia conver=re il numero -­‐1 con 8 bit –  Essendo il numero nega=vo: •  Codifica binaria del valore assoluto (1) su 8 bits 00000001 •  complemento a 2 è 11111111 –  Codifica complessiva: 11111111 Codifica complemento a 2 su 4 bit Base 10
Codifica su 4 bit del valore
assoluto
Codifica su 3 bit del valore
Codifica complemento a 2
-8
1000
-
1000
-7
0111
-
1001
-6
0110
-
1010
-5
0101
-
1011
-4
0100
-
1100
-3
0011
-
1101
-2
0010
-
1110
-1
0001
-
1111
0
-
000
0000
1
-
001
0001
2
-
010
0010
3
-
011
0011
4
-
100
0100
5
-
101
0101
6
-
110
0110
7
-
111
0111
Si no= che, anche se non è nella regola, il primo bit dei numeri nega=vi è comunque a 1 Limi= codifica complemento a 2 •  Dato un numero in complemento a 2, la sua conversione in decimale deve avvenire tramite la formula: -d N-1 ⋅ 2 N-1 + d N-2 ⋅ 2 N-2 + d N-3 ⋅ 2 N-3 +.... + d1 ⋅ 21 + d0 ⋅ 2 0
•  Da questa formula si vede che il numero più piccolo che può essere rappresentato con N bit è: N-1
-2
•  mentre il numero più grande è: N−2
N−3
1
0
N−1
2
+2
+.... + 2 + 2 = 2
−1
Limi= codifica complemento a 2 •  Data una codifica complemento a 2 di N bit sarà possibile rappresentare i numeri nell’intervallo [-­‐2N-­‐1, 2N-­‐1-­‐1] •  N=8 à [-­‐128, 127] •  N=16 à [-­‐32768, 32767] •  N=32 à [-­‐2147483648, 2147483647] Somma algebrica in codifica modulo e segno •  Da= due numeri binari in rappresentazione modulo e segno, le operazioni di somma algebrica dipende dai segni dei numeri •  Se i segni sono gli stessi: –  Si considerano tuG i bit meno quello del segno –  Si sommano tali sequenze –  Il numero binario risultante sarà o>enuto aggiungendo il bit di segno ai bit o>enu= dalla somma •  Se i segni dei due numeri sono diversi: –  Si considerano tuG i bit meno quello del segno –  Si so>rae il numero più piccolo in valore assoluto dal numero più grande –  Il numero binario risultante sarà o>enuto aggiungendo ai bit o>enu= dalla so>razione il bit di segno del numero in valore assoluto più grande. Somma tra numeri binari •  Le regole per realizzare la somma di singoli numeri binari sono: 0+0=0 0+1=1 1+0=1 1+1=0 con riporto di 1 •  Esempio: si vogliano sommare i numeri 0001 (1) e 1010(10). 0001+ 1010= _______ 1011 (11) •  Esempio: si vogliano sommare i numeri 0011 (3) e 1010(10). 0011+ 1010= _______ 1101 (13) Somma algebrica in complemento a 2 •  Da= due numeri binari in complemento a due, si applicano le regole dell'addizione a tuG i bit compreso il bit di segno •  Esempio: si sommino i numeri a 4 bit 0010 (+2) e 1010 (-­‐6) 0010+ 1010= ______ 1100 (-­‐4) •  Il numero binario risultante è già il risultato con il segno giusto Somma algebrica in complemento a 2 •  Esempio: Si sommino i numeri in complemento a 2 001100 (+12) e 100000 (-­‐32). 001100+ 100000= _______ 101100 (-­‐20) •  Il numero binario risultante è già il risultato con il segno giusto. Overflow problema=co •  Si supponga di lavorare sempre con codifica complemento a 2 su 4 bit (-­‐8,…,+7) •  Si vuole effe>uare la somma algebrica in complemento a due tra 1001 (-­‐7) e 1110 (-­‐2) •  La somma è -­‐9, non codificabile con 4 bit. •  Eseguendo la somma, il calcolatore oGene: 1001+ 1110= ________ 1 0111 •  Si ha il coside>o overflow: l'1 a sinistra, o>enuto come resto, eccede la normale capacità dei registri •  Il numero 0111 in complemento a 2 significa +7, che rappresenta però un risultato errato! Overflow innocuo •  Si supponga di lavorare con codifica complemento a 2 su 4 bit (-­‐8,…,+7) •  Si vuole effe>uare la somma algebrica in complemento a due tra 1001 (-­‐7) e 1111 (-­‐1) •  La somma è -­‐8 che è il limite inferiore codificabile con 4 bit •  Eseguendo la somma, il calcolatore oGene: 1001+ 1111= _________ 1 1000 •  Si ha overflow ma il numero 1000 in complemento a 2 significa –8, che rappresenta il risultato corre>o Overflow non evidente •  Esempio: Siano da= i numeri a 8 bit 01111110 (+126) e 00000011 (+3) 01111110+ 00000011= ___________ 10000001 •  Apparentemente non c’è overflow... ma c’è un cambiamento di segno anomalo •  A tu>o gli effeG un overflow della componente di pura rappresentazione della parte numerica avviene effeGvamente –  Un bit della parte della rappresentazione legata al valore assoluto interferisce con il segno! Come riconoscere errori di overflow? •  Tenere conto del bit “di riporto” a sinistra non è di per sè sufficiente a iden=ficare problemi dovu= all’overflow •  Sicuramente, in caso di numeri con segni discordi eventuali overflow non sono di natura problema=ca •  Nei casi veramente problema=ci l’overflow è anche accompagnato da un segno discordante tra quello degli operandi (che deve essere lo stesso) e quello del risultato –  Si ricorda che il bit più significa=vo anche in modalità complemento a 2 è associato al segno del numero Codifica dei Numeri Frazionari •  I numeri frazionari possono essere rappresenta= in due modalità: –  virgola fissa –  virgola mobile •  Essendo finita la rappresentazione interna all’elaboratore ne consegue che la rappresentazione di numeri reali implica degli errori •  La rappresentazione in virgola mobile è la più flessibile tra le due, quindi anche quella maggiormente diffusa Codifica in virgola fissa •  Degli n bit a disposizione: –  uno rappresenta il segno –  un certo numero rappresenta la parte intera –  ciò che resta rappresenta la parte frazionaria •  Problemi –  scarsamente flessibile: fissare la ripar=zione dei bit significa determinare limi= stringen= di cosa sia rappresentabile •  esempio mol= decimali, pochi interi à impossibile rappresentare numeri grandi con adeguata precisione Notazione scien=fica •  Qualsiasi numero in base 10 è rappresentabile in forma N = ±m ×10 e
•  In altri termini bastano 3 informazioni –  il segno –  la man=ssa –  l’esponente •  Esempi –  159300000 = 1.593 x 108 –  0.00001593 = 15.93 x 10-­‐4 •  Forma normale: valore della prima cifra della man=ssa maggiore di 0 e minore di 10 Notazione scien=fica normalizzata in binario •  In formato binario, analogamente N = ±m × 2 e
•  La normalizzazione è più facile e stringente: il valore della prima cifra della man=ssa dev’essere 1 Codifica dei Numeri Reali Virgola Mobile •  In un numero rappresentato in virgola mobile vengono stabili= un certo numero di bit assegna= per codificare il segno (s), la man=ssa (m) ed un certo numero di bit per codificare l'esponente (e). s (1 bit) e m •  É possibile in teoria avere un numero eleva=ssimo di codifiche in virgola mobile, cambiando: •  Numero bit •  Tipo di codifica binaria per man=ssa ed esponente •  Formula di conversione decimale/binario e viceversa Codifica dei Numeri Reali Virgola Mobile IEEE 754 •  Nell'anno 1985 l'IEEE (Ins=tute of Electrical and Electronics Engineers) ha definito uno standard per la codifica dei numeri reali in virgola mobile: IEEE 754 •  Lo standard prevedeva inizialmente due codifiche a 32 (float) e a 64 bit (double). Esistono poi delle estensioni, ad esempio a 80 bit •  La rappresentazione IEEE 754 prevede due diverse forme: –  Normalizzata (default) –  Denormalizzata (risultato di calcoli che producono numeri piccoli) Codifica dei Numeri Reali Virgola Mobile IEEE 754 •  Nella codifica float a 32 bit, vengono assegna=: –  1 bit per il segno (il bit più significa=vo), s –  8 bit per l'esponente, e –  23 bit per la man=ssa, m •  Nella codifica double a 64 bit, vengono assegna=: –  1 bit per il segno (il bit più significa=vo), s –  11 bit per l'esponente, e –  52 bit per la man=ssa, m Codifica dei Numeri Reali Virgola Mobile IEEE 754 Normalizzata 1≤e≤max max=254 (float) max=2046 (double) Denormalizzata e=0 Zero e=0 Infinito e=(1111..1)2=255 e=(1111..1)2=2047 m = codifica decimale della sequenza di bit della man=ssa N 10 = (−1) s ⋅ 1, m ⋅ 2e − p
m = codifica decimale della sequenza di bit della man=ssa N 10
m=0 N10 = 0
m=0 N10 = ∞
p=127 (float) p=1023 (double) = (−1)s ⋅ 0, m ⋅ 2 min
min= -­‐126 (float) min= –1022 (double) Codifica dei Numeri Reali Virgola Mobile IEEE 754 N10 = (−1)s ⋅ 0, m ⋅ 2−126
float N10 = (−1)s ⋅1, m ⋅ 2e−127
denormalizzata normalizzata 1x2-­‐126 ≈3.4 x 10 38 N10 = (−1)s ⋅1, m ⋅ 2e−1023
denormalizzata normalizzata double 1x2-­‐1022 N10 = (−1)s ⋅ 0, m ⋅ 2−1022
≈1.7 x 10 308