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