RAPPRESENTAZIONE BINARIA DELL'INFORMAZIONE In un calcolatore tutta l'informazione è rappresentata in forma binaria, cioè usando solo due simboli, usualmente indicati con le cifre 0 e 1 (in inglese 0 e 1 sono detti bit). Si usa anche il termine digitale, dall'inglese digit (cifra). La motivazione per limitarsi a due soli simboli è dovuta al fatto che essi possono essere rappresentati convenientemente con dispositivi fisici; per esempio magnetizzato o no, voltaggio alto o basso, luce o buio. CODIFICA DEI NUMERI Numeri naturali Noi rappresentiamo i numeri con una notazione posizionale che utilizza 10 cifre (numeri arabici). Un numero è rappresentato da una sequenza di cifre, e posizionale significa che il valore di una cifra dipende dalla sua posizione all'interno della sequenza. Esistono anche altri tipi di notazione per i numeri per esempio additive, dove ogni cifra indica una quantità da aggiungere o togliere, come il sistema di numerazione romana. Inoltre è possibile scegliere in molti modi il numero di cifre differenti che si usano in una notazione posizionale, non solo il 10; in genere si usano anche numerazione in base 2 (binaria), 8 (ottale), 16 (esadecimale). I codici BCD ( Binary Coded Decimal) sono utilizzati per rappresentare i numeri del sistema numerico decimale codificandoli cifra per cifra. Per rappresentare le dieci cifre decimali, un codice BCD richiede almeno 4 bit. Lo scopo della codifica è quello di permettere l'immediata conversione da decimale a binario e viceversa. Nel codice BCD- 8421 i bistabili del contatore assumono i pesi Q0=20; Q1=21; Q2=22, Q3=23 Nel sistema binario si usano le cifre 0 e 1. La base 2 è quella più piccola teoricamente possibile per un sistema di numerazione. Il valore posizionale è legato alle potenze di 2. Nel sistema ottale si usano 0,1,2,3,4,5,6,7. Il valore posizionale è legato alle potenze di 8. Nel sistema esadecimale si usano 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Il valore posizionale è legato alle potenze di 16. Esempi di conversione da base p a base decimale Esempio 1: Codifica decimale p=10 N10=5870 5870 = 5 * 103 + 8 * 102 + 7 * 101 + 0 * 100 Esempio 2: Codifica binaria p=2 N2=101001011 1010010112=1 * 28 + 0 * 27 + 1 * 26 + 0 * 25 + 0 * 24 + 1 * 23+0 * 22+1 * 21+1*20= 33110 Esempio 3: Codifica ottale p=8 N8=5348 5348= 5 * 82+3 * 81+4= 34810 Esempio 4: Codifica esadecimale p=16 N16=B7F B7F16= 11 * 162+7 * 161+15= 294310 Numeri interi Esistono due modi per rappresentare i numeri interi, supponiamo di usare m bit modulo/segno il primo bit rappresenta il segno (0 per il + e 1 per il -), i rimanenti n-1 bit rappresentano il modulo (un naturale) complemento a 2 un numero negativo -N è rappresentato dalla rappresentazione binaria di (2 alla m) - N, quelli positivi come al solito. Esempio: usando 4 bit i numeri 5 e -5 sono rappresentati rispettivamente da modulo/segno 0101 e 1101 complemento a 2 0101 e 1011 Infatti: m=4 (numero di bit) N=5 (numero da rappresentare) 5 - > 0101 -5 - > Complemento a 2: 2m –N - > 10000 0101 = 1011 In un codice a 8 bit quindi esistono in tutto 256 parole. Se volessimo allora servircene per rappresentare dei numeri, potremmo codificare in tutto 256 numeri, da 0 a 255. Per i numeri maggiori di 255 sarebbe necessario servirsi di parole formate da più di 8 bit. Per esempio, il numero 84.554, nel sistema di numerazione binario, richiede ben 17 bit. Esistono tuttavia particolari codici numerici che consentono di rappresentare qualsiasi numero con parole di pochi bit. Uno di questi è il cosiddetto codice BCD (codice binario decimale), che è un codice a 4 bit che si basa sulla corrispondenza mostrata dalla tabella: 0 1 2 3 4 5 6 7 8 9 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 In questo codice si rappresenta qualunque numero del sistema decimale associando a ogni sua cifra la rappresentazione della stessa cifra nel sistema binario. In sostanza, il sistema binario non viene utilizzato per rappresentare il numero, ma per rappresentare ciascuna sua cifra. Per esempio, il numero di quattro cifre 5973 è rappresentato con quattro sequenze di parole a quattro bit come segue: 0101 1001 0111 0011 Numeri reali Non è possibile rappresentare tutti i numeri reali utilizzando sequenze finite di bit (problema di cardinalità: l'insieme delle sequenze finite di bit è numerabile, mentre i reali hanno la cardinalità del continuo), pertanto rappresenteremo solo dei numeri razionali. Rappresentazione in virgola fissa Si rappresentano la parte intera e quella frazionaria di un numero reale con due sequenze di bit; la pare intera come visto sopra, mentre la parte frazionaria è rappresentata come un numero naturale ma utilizzando esponenti negativi della base (basta notare che, per esempio, 0,34 in base 10 rappresenta (3/10) + (4/100)). Quindi basta decidere quanti bit usare per la parte intera e quanti per la frazionaria. Con questa rappresentazione non si riescono a rappresentare molti numeri ed in genere solo numeri piuttosto piccoli; per esercizio quanti/quali numeri si rappresentano con 5+5 bit ? Rappresentazione in virgola mobile (floating point) Ricordarsi che nel mondo anglossasone si usa il punto e non la virgola per la parte frazionaria). Un numero reale può essere visto come dove M (detta mantissa) è un numero frazionario cioè compreso tra -1 e 1, ed n un numero intero (detto caratteristica) In questo caso basta decidere quanti bit usare per la mantissa e quanti per la caratteristica. Con questa rappresentazione si possono rappresentare numeri molto grandi e numeri molto piccoli. Per rappresentare i numeri reali, avremmo bisogno di estendere i pesi verso destra, continuando a decrementare l’esponente : 10-1, 10-2, 10-3, ... ottenendo tutte le cifre decimali che vogliamo. In modo analogo operano i computer solo che, anziché usare il sistema decimale, usano quello binario. Quindi il loro insieme di cifre è composto solo di due simboli :{0,1}, e di conseguenza i pesi si otterranno con le potenze di 2 dato che due è la base del sistema. Peso: Cifra: 23 22 21 20 2-1 2-2 2-3 1 0 1 1 0 1 0 Valore: 8*1+4*0+2*1+1*1+0.5*0+0.25*1+0.125*0=11.25 In questo esempio ho usato una rappresentazione a 7 bit, dove tra il quarto e il quinto bit abbiamo posto la nostra ipotetica virgola. Questa è quella che viene chiamata una rappresentazione a virgola fissa. Dall’ultimo esempio si può notare che la precisione massima è di 1/8, ma come dicevo prima basta aggiungere altri bit a destra per aumentarla, o in alternativa spostare la virgola verso sinistra, ma facendo in questo modo riduciamo il numero massimo rappresentabile. Per quanto riguarda la rappresentazione in virgola mobile, si sfrutta il concetto della notazione scientifica dei numeri, ossia: N=Mxe dove N è il numero da rappresentare, M la frazione o mantissa, x la base numerica(che nel nostro caso sarà 2, visto che il numero è rappresentato in binario), ed e è l’esponente. Per capire la notazione in virgola mobile, analizziamo la procedura usata per convertire i numeri. E quindi vediamo che nella notazione scientifica 2.500.000.000 si può scrivere come 2,5*109. Ma cosa abbiamo fatto per raggiungere questo risultato? Semplicemente abbiamo spostato la virgola fino alla prima cifra significativa e abbiamo aggiunto all’esponente, il numero di cifre attraversate dalla virgola. La prima cosa da evidenziare è che qualsiasi numero si può scrivere come: x = x/1*1 = x/100*100. Quindi se registriamo il risultato della frazione e dell’esponente, possiamo ottenere infinite rappresentazioni di un qualsiasi numero. Infatti aumentando il valore dell’esponente otterremo tutte rappresentazioni diverse dello stesso numero. 2 500 000 000/100*100 2500000000 * 100 (2500000000,0) 2 500 000 000/101*101 250000000 * 101 (250000000,1) 2 500 000 000/102*102 2500000 * 102 (25000000,2) … 2 500 000 000/108*108 25 * 108 (25,8) Nella rappresentazione in virgola mobile avviene la stessa cosa, dove i bit vengono mappati in modo che il primo rappresenti il segno, e i successivi divisi in due gruppi, uno per l’esponente e l’altro per la mantissa. S 1..7 8..31 In questa particolare mappatura, abbiamo 24 bit per la mantissa che ci permettono di rappresentare tutti i numeri da 0 a 224–1 = 16 777 215 che corrispondono a 7 cifre decimali, con un esponente di 7 bit(0..127) che viene rappresentato in complemento a due, cioè in modo che i valori possibili vengano considerati positivi da 0 a 63 e negativi da 64 a 127. La rappresentazione in complemento a due, potrebbe sembrare bizzarra visto che si sarebbe potuto usare un bit per il segno, ma senza entrare nei particolari, per motivi relativi all’hardware risultano molto più semplici da manipolare. Ma come al solito arrivo alla fine con i numeri che stupiscono, infatti con una rappresentazione a 32 bit mappati nel modo precedente, possiamo rappresentare un range di valori che vanno da 1,6*1064 a 1.6*1063 con una precisione di 7 cifre decimali significative. Mentre con una rappresentazione in virgola fissa, posta nel centro(tra il bit 15 e 16), saremmo arrivati 32768(circa 3,2*104), con una precisione di 8 cifre(4 per gli interi e 4 per i decimali). Per cui è chiaro il vantaggio che si ha nell’adottare la rappresentazione in virgola mobile, con cui si ha meno precisione, ma con la possibilità di rappresentare numeri infinitamente più grandi o più piccoli. Problemi/conseguenze Rappresentare i numeri in forma binaria utilizzando un numero fissato di bit porta a varie consequenze e pone dei problemi che occorre aver chiaro quando si scrivono programmi. Undeflow/Overflow In ogni calcolatore un numero fissato di bit verrà usato per rappresentare i numeri (siano interi o reali); per esempio per gli interi si usano in genere 32/64 bit. Effettuando delle operazioni su numeri rappresentati con n bit si può ottenere anche un numero non rappresentabile con tali bit; se il numero è troppo grande si parla di overflow, altrimenti di underflow. Approsimazione/errore I numeri reali sono rappresentati come approssimazioni razionali, e quindi modulo un certo errore, ma effettuando delle operazioni su tali numeri l'errore può modificarsi; pertanto occorre tenerne conto per prevedere i possibili effetti. Per esempio la somma può non essere associativa (es. (2 alla 32 + 3)+(-3) origina overflow, mentre 2 alla 32 + (3+(-3)) no); a * (b /a) può essere differente da b; quantità che dovrebbero essere zero non lo sono e così via. CODIFICA DEI CARATTERI I caratteri sono rappresentati con una codifica ad hoc usando un certo numero di bit; sono possibili molte scelte, quelle utilizzate attualmente sono degli standard. Il più noto è lo standard ASCII che utilizza 7 bit e contiene quindi 128 caratteri, che includono letttere maiuscole e minuscole, cifre, segni di punteggiatura, lo spazio vuoto, detto anche blank, e caratteri di controllo dell'impaginazione, come fine linea, tabulazione, fine pagina. Standard più moderni, utilizzati per esempio nelle pagine WEB, sono: ISO LATIN 1 o Questo codice usa 8 bit, quindi 256 caratteri diversi. o Oltre ai caratteri ASCII, ISO Latin-1 contiene vari caratteri accentati e lettere usate dai linguaggi dell’Europa occidentale (Italiano, Francese, Spagnolo, Tedesco, Danese, etc) IMMAGINI, SUONI, VIDEO Anche altri tipi di informazione possono essere rappresentati come sequenze di bit, pensare al suono digitale dei CD e alla prossima televisione digitale. L'idea base per rappresentare un'immagine è decomporla in punti, usualmente detti pixel (in origine gli elementi dello schermo), e definire per ogni punto il suo colore (o gradazione di grigio). Pertanto un'immagine è essenzialmente una matrice i cui elementi descrivono bianco o nero (1 bit per pixel); gradazione di grigio (8 toni 3 bit, 16 toni 4 bit,...), oppure un colore, rappresentato per esempio dicendo quanto rosso, blu e verde contiene (sistema RGB Red, Green and Blu) usando percentuali. Dato che le immagini possono richiedere un numero enorme di bit per essere rappresentate adeguatamente esistono metodi per compattarle e vi sono anche degli standard, come GIF, TIFF, JPEG, .... I video sono solo sequenze di immagini opportunamente compattate, mentre per i suoni si usano tecniche basate sulla rappresentazione di un suono come insieme di onde.