Sei sulla pagina 1di 15

Capitolo 2 Rappresentazione delle Informazioni

2.1

Introduzione

I calcolatori sono macchine elettroniche, quindi basate su dei circuiti in cui scorrono delle correnti elettriche. Le informazioni che i calcolatori elaborano sono rappresentate mediante segnali elettrici. Dal momento che la cosa pi` u semplice da misurare in un circuito elettrico ` controllare se la corrente pase sa o non passa (piuttosto che misurare quanta ne passa), segue che un dato circuito elettrico pu` rappresentare facilmente le informazioni usando un alo fabeto a due simboli (un simbolo, che convenzionalmente identichiamo con 0, rappresenta sicamente lassenza di corrente nel circuito, e laltro simbolo, che convenzionalmente identichiamo con 1, rappresenta sicamente il passaggio di corrente nel circuito). In virt` di questa scelta, tutte le informazioni vengono rappresentate alu linterno del calcolatore con un alfabeto di due simboli detto alfabeto binario. Questo chiarisce lattributo di digitale dato al calcolatore. Esiste solo un numero nito di simboli (2) con i quali ` possibile costruire delle parole binarie e (sequenze nite di simboli binari) e rappresentare le informazioni. Non ` dicile riconoscere che un alfabeto ridotto semplica i circuiti logici e deputati allelaborazione in quanto sono solo due i simboli da rappresentare e da riconoscere. Come gi` detto, il simbolo 0 si pu` rappresentare con una a o tensione elettrica nulla e il simbolo 1 con una tensione assegnata positiva; se invece si volesse implementare un calcolatore in grado di rappresentare
1

Francesco Oliveri, Appunti di Fondamenti di Informatica, 2002-2003.

2 ad esempio 50 simboli diversi con correnti elettriche di opportuna intensit` a sarebbe necessario usare dei circuiti abbastanza precisi da misurare le intensit` di corrente (in qualche senso si avrebbe bisogno di computer ad alta a fedelt`). a I simboli 0 e 1 sono solo dei simboli convenzionali e non hanno il signicato di numeri. Ciascuno di questi due simboli si chiama BIT (che ` e un acronimo formato a partire dalle parole BInary digiT, cio` cifra binae ria). Avremo quindi un bit 0 e un bit 1. Un bit esprime nel calcolatore uninformazione elementare. ` E evidente che utilizzando un solo bit ` possibile rappresentare solo due e informazioni (proprio come con parole di una lettera dellalfabeto inglese possiamo rappresentare solo 26 informazioni diverse). Se invece utilizziamo diversi bit ed associamo ad essi un certo signicato secondo una qualche convenzione, allora un insieme di bit pu` rappresentare un numero (anche o elevato) di informazioni diverse. Ad esempio, utilizzando due bit possiamo rappresentare 4 (22 ) informazioni diverse con le combinazioni (o parole binarie di 2 bit) 00, 01, 10, 11. Con 3 bit possiamo rappresentare 8 (23 ) informazioni diverse: 000, 001, 010, 011, 100, 101, 110, 111. In generale con N bit (essendo N un numero intero positivo) potremo rappresentare 2N informazioni diverse. Una caratteristica essenziale dei calcolatori ` che usano sempre parole binarie di lunghezza ssa. e

2.2

Informazioni alfanumeriche

Correntemente noi rappresentiamo le informazioni (almeno una parte consistente di esse) usando un alfabeto composto da alcune decine di simboli: le lettere maiuscole dalla A alla Z, le lettere minuscole dalla a alla z, le cifre da 0 a 9, il carattere di spazio , i segni di punteggiatura (., ,, ;, :, !, ?, etc.) e altri simboli speciali (come @, #, etc.). Quindi, se vogliamo codicare informazioni costituite da sequenze di tali simboli (informazioni alfanumeriche) ` necessario avere una rappresentazione di tutti i e simboli utilizzati in termine di sequenze di bit. Il codice oggi universalmente utilizzato ` il codice ASCII (che ` una sigla e e che sta per American Standard Code for Information Interchange, cio` Codice Standard Americano per lInterscambio di Informazioni): si e tratta di un codice a 8 bit (8 bit costituiscono un byte). Con 1 byte ` possibile rappresentare 256 (28 ) informazioni diverse, un e numero suciente per i caratteri alfanumerici (lettere dellalfabeto, cifre, caratteri speciali). Ad esempio, nel codice ASCII la sequenza 01000001

3 rappresenta il carattere A, la sequenza 00100000 rappresenta lo spazio, la sequenza 00110001 la cifra 1, e cos` via.

2.3

Informazioni numeriche Notazione posizionale

Oltre ai caratteri, un tipo importante di informazione con cui si ha a che fare ` costituita dai numeri (con o senza segno, con o senza parte frazionaria). e Un modo di rappresentarli potrebbe essere quella di convertire la sequenza dei caratteri che costituiscono un numero (le cifre con eventualmente il punto decimale) nella corrispondente sequenza di byte in accordo con la codica ASCII. Questo modo di procedere non ` tuttavia molto eciente perch e e complicherebbe enormemente le operazioni aritmetiche: sarebbe in qualche senso rappresentare i numeri con la stessa losoa che sta alla base della numerazione romana (in cui MDCCCCVII rappresenta 1907) e buttare a mare linvenzione della rappresentazione dei numeri (e della conseguente facilit` a nelleseguire le operazioni) fatta dagli Indiani nellOttavo secolo e portata in Occidente dagli Arabi. ` E possibile invece trovare un modo di rappresentare i numeri usando lalfabeto binario e preservando la facilit` di eettuare le operazioni aritmetiche. a Per far questo ` opportuno prima riettere sul nostro modo di rappresentare e i numeri, che ` detto sistema numerico decimale posizionale. e Il sistema si dice decimale perch si utilizzano 10 simboli diversi (le cifre e 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) e posizionale perch il valore (o peso) di una cifra e non ` assoluto, ma dipende dalla posizione che essa occupa nel numero. e Ad esempio, nel numero 1471 la cifra 1 che sta a sinistra ha un peso maggiore della cifra 1 che sta a destra. Pi` precisamente, si ha che in 1471 ci u sono: 1 migliaio, 4 centinaia, 7 decine e 1 unit`. Pi` formalmente, andando a u da destra verso sinistra: 1471 = 1 100 + 7 101 + 4 102 + 1 103 . Il sistema di numerazione decimale si dice anche in base 10, dal momento che ogni intero decimale si esprime come somma dei prodotti delle singole cifre per il rispettivo peso (potenze del 10 crescenti da destra verso sinistra). Usiamo in maniera naturale la base 10 semplicemente perch, per un qualche e scherzo dellevoluzione, la Natura ci ha dotato di 2 mani ciascuna con 5 dita e che con queste dita ci aiutiamo nel far di conto. Se vogliamo trasportare questo sistema ai calcolatori, che non hanno dita e che per costruzione hanno dimestichezza con 2 soli simboli, ` ovvio che e

4 saremo costretti ad usare un sistema numerico binario posizionale, un sistema cio` in cui il peso di ogni singola cifra (che pu` essere 0 o 1) allinterno del e o numero ` una potenza del 2 (invece che del 10). e Cos` il numero binario (1011)2 (che si legge uno zero uno uno in base , due) pu` essere convertito nel suo equivalente decimale (partendo da destra o e andando verso sinistra) come segue: 1 20 + 1 21 + 0 22 + 1 23 = (11)10 , e quindi rappresenta il numero decimale undici. Nellespressione di un numero binario, il bit pi` a sinistra, che ha il peso u maggiore, si indica con MSB (Most Signicant Bit, bit pi` signicativo), u mentre il bit pi` a destra, che ha il peso minore, si indica con LSB (Least u Signicant Bit, bit meno signicativo). Dunque, data una sequenza di bit, se essa rappresenta la codica di un numero, ` facile risalire al suo valore e nel nostro sistema decimale, semplicemente facendo la somma dei prodotti delle cifre che lo costituiscono (da destra verso sistra) per la corrispondente potenza del 2 (si parte dalla potenza 0 e si aumenta di 1 man mano che ci si sposta verso sinistra). Per convertire invece un numero espresso nel sistema decimale in binario si usa il metodo detto delle divisioni successive. Supponiamo ad esempio di voler trovare la rappresentazione binaria di 990: lo dividiamo per 2 ottenendo 495 e un resto che in questo caso sar` 0. Dividiamo ora il risultato ottenuto a per 2 e ripetiamo il procedimento no ad ottenere come quoziente 0. I resti delle successive divisioni, presi nellordine dallultimo al primo, forniscono le cifre della rappresentazione binaria del numero, dalla pi` signicativa alla u meni signicativa. 990 : 2 = 495 495 : 2 = 247 247 : 2 = 123 123 : 2 = 61 61 : 2 = 30 30 : 2 = 15 15 : 2 = 7 7:2=3 3:2=1 1:2=0 con con con con con con con con con con resto resto resto resto resto resto resto resto resto resto 0 1 1 1 1 0 1 1 1 1

Dunque, la rappresentazione binaria di (990)10 ` (1111011110)2 . e ` chiaro a questo punto che si pu` passare dal sistema di numerazione E o decimale a quello binario, e viceversa, per numeri interi; queste operazioni

5 di conversione, per quanto concettualmente semplici, sono in genere lunghe e noiose. Daltra parte, la rappresentazione di un numero in binario ` molto e pi` lunga e pesante della rappresentazione decimale. u Per ovviare a questo inconveniente si usano due altri sistemi di numerazione, lottale e lesadecimale, che hanno il vantaggio di essere pi` compatti del u sistema binario e, nello stesso tempo, immediatamente convertibili in esso. Il sistema ottale ` in base 8 e usa i simboli da 0 a 7. La conversione e di un numero da decimale a ottale si fa subito con le divisioni successive per 8 e prendendo al solito i resti. La conversione da binario a ottale e viceversa ` invece immediata. Infatti, poich` 8 = 23 ` facile capire perch un e e e e numero binario pu` essere convertito in ottale semplicemente raggruppando o (da destra verso sinistra, eventualmente aggiungendo a sinistra qualche 0) a tre a tre le sue cifre e sostituendo ad ogni gruppo cos` formato la cifra ottale corrispondente (una cifra da 0 a 7). Viceversa, un numero ottale si trasforma in binario convertendo ogni sua cifra nel corrispondente numero binario a 3 cifre. Esempio 2.3.1 Il numero binario a 16 bit 0100101101011111 (che in decimale corrisponde a 19295) viene trasformato nel sistema ottale come segue. Raggruppiamo da destra a sinistra le cifre a gruppi di 3 (e aggiungiamo due 0 a sinistra) e trasformiamo ogni gruppo di 3 bit nella corrispondente cifra ottale: 000(100)(101)(101)(011)(111) 45537. Viceversa il numero ottale 37245 (he corrisponde in decimale a 16053) viene trasformato in binario (ad esempio a 16 bit) sostituendo ogni cifra con il corrispondente binario a 3 bit e aggiungendo uno 0 a sinistra: 37245 0011111010100101. Il sistema esadecimale ` un sistema posizionale in base 16 (usa dunque e 16 simboli per rappresentare i numeri da 0 a 15). I simboli da 0 a 9 rappresentano i numeri da zero a nove, la lettera A rappresenta il dieci, la B lundici, la C il dodici, la D il tredici, la E il quattordici e la F il quindici. La conversione da decimale a esadecimale al solito si fa con le

6 divisioni successive per 16 e considerando i resti, mentre le conversioni tra binario ed esadecimale e tra esadecimale e binario si fanno come nel caso del sistema ottale raggruppando (sempre da destra verso sinistra con laggiunta eventuale a sinistra di qualche 0) le cifre a 4 a 4 e dandone la rappresentazione esadecimale, o, viceversa, sostituendo ad ogni cifra esadecimale il suo corrispondente in binario con quattro cifre. Esempio 2.3.2 Il numero binario a 16 bit 0100101101011111 (che in decimale corrisponde a 19295) viene trasformato nel sistema esadecimale come segue. Raggruppiamo da destra a sinistra le cifre a gruppi di 4 e trasformiamo ogni gruppo di 4 bit nella corrispondente cifra esadecimale: (0100)(1011)(0101)(1111) 4B7F. Viceversa il numero esadecimale A7BE (he corrisponde in decimale a 40960) viene trasformato in binario (ad esempio a 16 bit) sostituendo ogni cifra con il corrispondente binario a 4 bit: A7BE 1010011110111110. Nella conversione da decimale a binario si utilizza normalmente la divisione ripetuta per 2, mentre nella conversione da binario a decimale si fa la somma dei prodotti delle cifre binarie per le corrispondenti potenze di 2. Dunque, utilizziamo due algoritmi diversi per fare essenzialmente la stessa cosa (perch in entrambi i casi si tratta di conversione di base). Luso di e due algoritmi diversi ` dovuto alla nostra abilit` (nonch abitudine) a lavoe a e rare usando il sistema decimale. Se invece avessimo maggiore abilit` a fare a i conti in binario, noi potremmo convertire i numeri da decimale in binario facendo (nel sistema binario!) la somma delle potenze del dieci. Ad esempio per convertire il numero 123 in binario potremmo semplicemente calcolare in binario 11 + 10 (1010) + 1 (1010)10 che non ` altro che la versione binaria dellespressione e 3 + 2 10 + 1 102

7 in decimale. Analogamente, per convertire da binario a decimale potremmo eettuare (in binario) le divisioni per dieci (che in binario ` 1010) e prendere i resti e dallultimo al primo. Dunque, la codica (e la conversione) dei numeri interi nel sistema binario ` risolta. Se utilizziamo ad esempio 2 byte (16 bit) per rappresentare i numeri e interi, ` evidente che il pi` piccolo numero sar` 0 (codicato con 16 bit 0), e u a mentre il pi` grande sar` 65535 (codicato con 16 bit 1): infatti, con 16 bit u a possiamo rappresentare 65536 informazioni (in questo caso numeri) diversi. Sfortunatamente, i numeri interi positivi non esauriscono la totalit` dei a numeri con cui abbiamo lopportunit` di lavorare. Ci sono infatti gli interi a negativi. Prima di arontare il problema della rappresentazione del segno ` e opportuno vedere come si eettuano le operazioni aritmetiche. Cominciamo a vedere come si eettua la somma di due numeri binari. Analogamente a quanto succede nel sistema decimale, sappiamo fare la somma di due numeri quando impariamo la tabellina della somma, che in binario ` particolarmente semplice, visto che si hanno solo due cifre diverse. Si ha la e seguente tabellina della somma: + 0 1 0 0 1 1 1 10 cio`: e 0 + 0 = 0, 0 + 1 = 1 + 0 = 1, 1 + 1 = 0 con riporto di 1.

Quindi, se dobbiamo fare la somma dei numeri binari 10110011 + 01000111 (in decimale: 179 + 71) allineeremo i due numeri a destra e avremo: 10110011 01000111 11111010 + =

che, espresso in decimale, rappresenta 250. Per fare la somma di due numeri di N bit ` necessario avere N sommatori e di 1 bit messi in serie. Ogni sommatore accetter` 2 ingressi (i due bit addendi) a e fornir` due uscite (un bit somma, che sar` 0 se i due bit addendi sono uguali a a e 1 se i due bit addendi sono diversi, e un bit riporto che sar` 1 solo nel caso a in cui i due bit addendi sono entrambi 1 e 0 negli altri casi).

8 La moltiplicazione tra due numeri binari di N bit si eettua anchessa in maniera semplice: in questo caso il risultato sar` di 2N bit. La tabellina a della moltiplicazione ` la seguente: e 0 1 0 0 0 1 0 1 cio`: e 0 0 = 0, Ad esempio: 011011 011100 000000 0000000110110110110111000000001011110100 x = 0 1 = 1 0 = 0, 1 1 = 1.

che corrisponde, in decimale, a: 27 28 = 756. Nel sistema decimale rappresentiamo i numeri negativi semplicemente precedendo il corrispondente numero positivo con il segno -. Nel caso del sistema binario non abbiamo a disposizione il segno -, ma soltanto i bit 0 e 1. Possiamo quindi decidere di rappresentare per esempio con 0 il segno + e con 1 il segno -. Dunque, se vogliamo rappresentare un intero con segno, uno dei bit (per esempio quello che sta allestrema sinistra) non rappresenta una potenza del 2 ma il segno. Ne consegue che met` dei possibili numeri saranno negativi a e met` positivi (con 16 bit avremo 32768 numeri negativi e 32768 numeri a positivi). Assumiamo di avere a disposizione 16 bit per rappresentare i numeri interi (la maggior parte dei compilatori mette a disposizione 16 bit per i numeri interi). Una possibile scelta potrebbe essere la seguente. Si usa il bit pi` signicativo (MSB) per rappresentare il segno (positivo se MSB = 0, u negativo se MSB = 1), mentre gli altri bit rappresentano il valore assoluto del numero. Con questa convenzione si ha la seguente tabella di corrispondenza tra numeri binari e numeri decimali:

9
Rappr. Binaria Val. Decimale Rappr. Binaria Val. Decimale

0000000000000000 0000000000000001 0000000000000010 0000000000000011 0000000000000100 ... ... 0111111111111100 0111111111111101 0111111111111110 0111111111111111

+0 +1 +2 +3 +4 ... ... +32764 +32765 +32766 +32767

1000000000000000 1000000000000001 1000000000000010 1000000000000011 1000000000000100 ... ... 1111111111111100 1111111111111101 1111111111111110 1111111111111111

-0 -1 -2 -3 -4 ... ... -32764 -32765 -32766 -32767

Con questa scelta, per`, ci ritroviamo uno zero negativo e uno zero posio tivo (situazione piuttosto curiosa); inoltre, mentre nella colonna di sinistra i numeri (positivi) crescono scorrendo la tabella dallalto verso il basso, nella colonna di destra i numeri (negativi) decrescono scorrendo la tabella dallalto verso il basso. Esiste una soluzione migliore che evita lesistenza di uno zero negativo e di uno zero positivo, fa s` che in ambedue le colonne i numeri crescano scorrendo la tabella dallalto verso il basso e, fatto pi` imu portante, permette anche di eettuare le sottrazioni come normali addizioni (realizzando cos` concretamente quello che si dice in algebra a proposito della sottrazione che ` equivalente alladdizione di una quantit` negativa). e a Tale scelta (nota come convenzione del complemento a due) prevede la seguente rappresentazione (a 16 bit, ma si estende facilmente a N bit). Anche qui il bit pi` signicativo rappresenta il segno (positivo se 0, negativo se 1); u mentre nel caso di un numero positivo il valore del numero si ricava dai restanti bit, nel caso di un numero negativo ` necessario, prima di conoscere e il valore assoluto del numero, eettuare due semplici operazioni. Se abbiamo numeri a 16 bit, la tabella di corrispondenza tra numeri binari e numeri decimali con la convenzione del complemento a 2, ` la seguente: e

10
Rappr. Binaria Val. Decimale Rappr. Binaria Val. Decimale

0000000000000000 0000000000000001 0000000000000010 0000000000000011 0000000000000100 ... ... 0111111111111100 0111111111111101 0111111111111110 0111111111111111

+0 +1 +2 +3 +4 ... ... +32764 +32765 +32766 +32767

1000000000000000 1000000000000001 1000000000000010 1000000000000011 1000000000000100 ... ... 1111111111111100 1111111111111101 1111111111111110 1111111111111111

-32768 -32767 -32766 -32765 -32764 ... ... -4 -3 -2 -1

Per capire che la sequenza di bit 1111111111111100 rappresenta 4 applichiamo il seguente procedimento: poich il bit pi` sie u gnicativo ` 1 si tratta di un numero negativo; per conoscere il suo valore e assoluto invertiamo ciascun bit (cio` sostituiamo ogni bit 1 con il bit 0, e e ogni bit 0 col bit 1), ottenendo cos` 0000000000000011 ; a questo punto sommiamo a questa sequenza di bit la sequenza 0000000000000001 (che rappresenta in decimale il numero 1). Otteniamo la sequenza di bit 0000000000000100 che in decimale rappresenta proprio 4. Viceversa, per avere la rappresentazione a 16 bit di 7, partiamo dalla rappresentazione a 16 bit di 7: 0000000000000111 . Invertiamo bit a bit ottenendo 1111111111111000 , sommiamo 0000000000000001 ,

11 e otteniamo 1111111111111001 , che corrisponde in decimale a 7. Esiste un modo alternativo (e migliore) di riconoscere il valore decimale di un numero binario: esso consiste nel dare un peso anche al bit pi` signicativo u (bit di segno). Pi` precisamente, se si utilizzano 16 bit, allora attribuiamo u al bit pi` signicativo il peso (negativo) di 215 (cio` -32768); in generale u e per una rappresentazione a N bit, il bit di segno peser` 2N 1 . Quindi, il a numero binario (con la convenzione del complemento a 2) 1100010110100011 rappresenter` (scorrendo i bit da destra verso sinistra): a 1 + 2 + 32 + 128 + 256 + 1024 + 16384 32768 = 14941 Poich il bit pi` signicativo ha un peso negativo ` evidente che quando si e u e rappresentano i numeri in binario ` necessario usare una rappresentazione a e lunghezza ssa (ma questo ` la norma nei calcolatori). e Rappresentando gli interi con segno con la convenzione del complemento a 2, ` possibile far vedere che le sottrazioni non sono altro che addizioni. Ad e esempio, loperazione 7 5 = 2 pu` essere fatta eseguendo 7 + (5) come o segue (immaginando sempre di usare la rappresentazione a 16 bit): 0000000000000111 + 1111111111111011 = 0000000000000010 Va notato che la somma dei bit allestrema sinistra ha causato un riporto che viene perso e nonostante ci` il risultato ` corretto. o e Cosa succede se per esempio facciamo 32765+10 o (-32766)+(-5)? Nel primo caso abbiamo 0111111111111101 + 0000000000001010 = 1000000000000111 che in realt` rappresenta -32761 e non 32775 (in questo caso la somma dei a bit allestrema sinistra non ha determinato alcun riporto!). Nel secondo caso otteniamo 1000000000000010 + 1111111111111011 = 0111111111111101

12 che in realt` rappresenta 32765 e non -32771 (in questo caso la somma dei a bit allestrema sinistra ha causato un riporto che viene perso, ma stavolta il risultato ` sbagliato!). e Abbiamo ottenuto due risultati sbagliati (era ovvio, visto che con la rappresentazione a 16 bit i numeri che possiamo rappresentare devono essere compresi tra -32768 e 32767): questo non sarebbe successo se la nostra rappresentazione fosse stata a 32 bit. Il problema `: come capire se si ` vericato nel corso di una somma e e un errore (risultato maggiore del massimo numero rappresentabile, risultato ` minore del numero minimo rappresentabile)? E possibile fare un semplice controllo che ci dice se il risultato ottenuto ` corretto oppure no. Questo e controllo consiste nel vericare luguaglianza dei cosiddetti riporti in ingresso e in uscita. In una somma di due numeri di N bit, si dice riporto in ingresso il riporto che si ha nella penultima somma di bit, riporto in uscita il riporto che si ha nellultima somma di bit (quella, per inciso, che riguarda i bit di segno). Il risultato ` corretto se il riporto in ingresso ` uguale al riporto in uscita, e e ` sbagliato se i due riporti sono diversi. Non ` dicile rendersi conto di e e questa aermazione: infatti, poich i bit pi` signicativi hanno un peso e u negativo, ` evidente che eventuali riporti acquisiti devono essere rilasciati: se e invece il riporto in ingresso ` 1 e il riporto in uscita ` 0 si ha che il numero e e che otteniamo ` gravato da un peso negativo che non ha smaltito; nel caso e contrario, il risultato ha perso un peso negativo. In generale, se per i numeri interi con segno utilizziamo N bit potremo rappresentare, con la convenzione del complemento a 2, tutti i numeri compresi tra 2N 1 e 2N 1 1.

2.4

Numeri con parte frazionaria

Abbiamo visto la conversione dei numeri interi dal sistema decimale a quello binario e viceversa. Vediamo ora come codicare in binario i numeri che in valore assoluto sono minori di uno. In un numero decimale con la virgola i pesi delle cifre a destra della virgola corrispondono a potenze negative (e decrescenti spostandosi da sinistra verso destra) del 10. Ad esempio: 0.345 = 3 101 + 4 102 + 5 103 .

Lo stesso vale ovviamente per i sistemi di numerazione con base diversa da 10. La conversione di un numero minore di uno dal sistema di numerazione

13 decimale a quello binario si eettua col metodo delle moltiplicazioni successive per 2. Il numero originale viene moltiplicato per 2; la parte intera del risultato ` la prima cifra a destra della virgola della rappresentazione binae ria. Il risultato, privato della parte intera, viene nuovamente moltiplicato per 2, ottenendo un numero la cui parte intera ` la seconda cifra a destra e della virgola della rappresentazione binaria. Il procedimento continua no ad ottenere come risultato zero, o, se ci` non ` possibile, no al nostro possibile o e grado di approssimazione. Ad esempio, se vogliamo trasformare il numero decimale 0.125 in binario opereremo come segue: 0.125 2 = 0, 25 e prendiamo come cifra binaria 0 0.25 2 = 0.5 e prendiamo come cifra binaria 0 0.5 2 = 0 (abbiamo tolto 1) e prendiamo come cifra binaria 1. Cos` potremo scrivere: (0.125)10 = (0.001)2 Se, invece, vogliamo trasformare il numero decimale 0.3 in binario (avendo a disposizione 6 cifre binarie) opereremo come segue: 0.3 2 = 0, 6 e 0.6 2 = 0.2 (abbiamo tolto 1) e 0.2 2 = 0.4 e 0.4 2 = 0.8 e 0.8 2 = 0.6 (abbiamo tolto 1) e 0.6 2 = 0.2 (abbiamo tolto 1) e Cos` potremo scrivere: (0.125)10 = (0.010011)2 , dove, essendo (0.010011)2 equivalente in decimale a 1 1 1 19 + + = = 0.296875, 4 32 64 64 abbiamo commesso un errore (dovuto alla disponibilit` di soli 6 bit) nella a rappresentazione. Come gi` detto, se usiamo parole a 16 bit per rappresentare i numeri a interi con segno allora il range in cui questi possono variare ` compreso e prendiamo prendiamo prendiamo prendiamo prendiamo prendiamo come come come come come come cifra cifra cifra cifra cifra cifra binaria binaria binaria binaria binaria binaria 0 1 0 0 1 1.

14 ` tra -32768 e 32767. E possibile rappresentare numeri pi` grandi usando la u rappresentazione in virgola mobile (oating point numbers) simile a quella scientica. In virgola mobile ogni numero viene rappresentato come numero con virgola con parte intera nulla e con la cifra pi` signicativa a destra della virgola u (cio` la prima cifra dopo la virgola) diversa da zero, moltiplicato per unope portuna potenza della base. Nella rappresentazione dei numeri reali si scinde cos` la parte che tiene conto della precisione con la quale conosciamo un numero (la mantissa) dalla parte che ci d` lordine di grandezza del numero a stesso (esponente). Nella rappresentazione in oating point, degli N bit usati, una parte serve a rappresentare le cifre a destra della virgola, che costituisce quella che si chiama mantissa, e laltra per lesponente della base. Inoltre, in generale, il bit pi` signicativo viene usato per rappresentare il segno del u numero (0 per i numeri positivi e 1 per i numeri negativi). Per i numeri in oating point generalmente vengono usati 4 byte (e si dice che il numero ` rappresentato in singola precisione, con circa 6-7 cifre e decimali esatte) oppure 8 bytes (e si dice allora che il numero ` rappresentato e in doppia precisione, con 12-13 cifre decimali esatte). Quindi un numero in virgola mobile si rappresenta come una coppia di numeri, la mantissa e lesponente: Numero = Mantissa BaseEsponente essendo lesponente un numero intero (positivo o negativo) e la mantissa soggetta alla seguente limitazione: Base1 Mantissa < 1, a meno che il numero non sia identicamente zero (e allora la mantissa sar` a 0). Grazie a ci` ` possibile rapresentare in memoria un numero per mezzo o e delle seguenti informazioni: 1. la mantissa o parte frazionaria; 2. lesponente ovvero il numero intero per ottenere la forma normalizzata. Vediamo qualche esempio: Numero Mantissa Esponente 7.1 0.71 1 0.000045 0.45 -4 2564.3 0.25643 4

15 Quindi ogni numero ` di fatto rappresentato da due numeri: la mantissa e e lesponente. Dati i numeri (mantissa1, esponente1) e (mantissa2, esponente2), il loro prodotto avr` per mantissa il prodotto delle mantisse e per a esponente la somma degli esponenti. Le operazioni da eseguire sono: 1. la somma degli esponenti; 2. il prodotto delle mantisse; 3. la (eventuale) normalizzazione del risultato. Queste operazioni possono portare ad una perdita di informazioni dal momento che si pu` avere un superamento del numero di bit destinato alla o mantissa o allesponente; nel primo caso tale superamento conduce ad errori di troncamento, cio` ad una perdita in precisione del risultato, nel secondo e caso ad un overow, cio` ad un superamento dei limiti di rappresentazione. Si e ha invece un underow quando il risultato di unoperazione ` troppo piccolo e per essere rappresentato: in questi casi usualmente il risultato viene posto uguale a zero. Nel caso in cui bisogna sommare due numeri in virgola mobile vanno distinti due casi: 1. i due numeri hanno la stesso esponente: in questo caso il risultato avr` per mantissa la somma delle mantisse e per esponente lo stesso a esponente dei due addendi; potr` rendersi necessaria una eventuale a normalizzazione della mantissa del risultato; 2. i due numeri hanno diverso esponente: occorre ridursi al caso precedente facendo uttuare la virgola di uno dei due numeri e modicare opportunamente lesponente. Queste operazioni di uttuazione della virgola mobile fanno s` che, quando si eseguono delle operazioni aritmetiche tra numeri in virgola mobile, gli errori di troncamento e di arrotondamento siano sempre in agguato.

Potrebbero piacerti anche