La codifica dell’informazione La rappresentazione dei numeri Introduzione Il concetto di numero è un concetto astratto, che per abitudine identifichiamo con la sua rappresentazione. Se vediamo espresso questo simbolo : “2” pensiamo direttamente alla quantità che rappresenta. In realtà questo simbolo è solo uno dei tanti modi di rappresentare la quantità 2. Ad esempio, nel caso dei numeri romani il numero II si rappresenta come appena scritto. La rappresentazione dei numeri che utilizziamo abitualmente è detta rappresentazione posizionale dei numeri in base 10. Cenni storici La rappresentazione posizionale dei numeri in base risale agli Indiani, e fu introdotta in Europa nel '200, attraverso gli Arabi. Si trova descritta nel "Liber Abacus" di Leonardo Fibonacci, un manuale per imparare a far di conto con il nuovo metodo, che prometteva grandi vantaggi pratici. La parola "cifra" proviene dall'arabo "sifr", che significava "vuoto" e indicava lo zero. Fibonacci tradusse "sifr" con "zefiro" (il nome di un gradevole venticello primaverile), da cui proviene il nostro "zero". Lo zero non esisteva nei sistemi di numerazione precedenti, ed è essenziale per un sistema posizionale: consideriamo ad esempio la rappresentazione di "centodue", in cui manca la potenza di dieci con esponente uno: è necessaro servirsi dello zero come "segnaposto" per indicare appunto la mancanza della potenza , altrimenti scriveremmo , che ha un significato del tutto diverso. I nomi dei numeri, che ancora usiamo, suggeriscono che un modo di contare basato sul 10 fosse già in uso, dato che diamo nomi speciali alle potenze di dieci: dieci, cento, mille, ecc., e costruiamo i nomi dei numeri servendoci di questi nomi speciali: venti, trenta, duecento, tremila, quattro milioni e così via. I romani usavano, come abbiamo visto, un sistema di numerazione diverso, sempre basato sul dieci, ma non posizionale, ossia in cui il significato delle cifre è sempre lo stesso, indipendentemente dalla loro posizione (si dice anche, in questo caso, che le cifre hanno un valore nominale). Il sistema romano era invece additivo (e sottrattivo), nel senso che, ad esempio, nella rappresentazione del numero , ossia XXIV, i valori delle prime due cifre si sommano per ottenere ; le ultime due cifre danno mediante sottrazione di da , e viene poi sommato al già ottenuto per avere . Un sistema poco pratico, come si può immaginare, per scrivere numeri molto grandi. Dieci non è l'unica base possibile. I Sumeri usavano un sistema di rappresentazione misto che utilizzava la base , con il come base ausiliaria. Per rappresentare le cifre veniva usato un sistema additivo, del tipo di quello romano, basato su simboli per , , , . Ad esempio, il numero veniva scritto in questo modo (utilizzando, per semplicità, al posto delle cifre originali per , , e , i nostri simboli attuali, e tenendo presente che la cifra per era ottenuta combinando graficamente le cifre per e per ): e quindi era rapppresentato come mescolando, quindi, le basi e . Gli astronomi babilonesi usavano un sistema basato anch'esso su e , ma che, a differenza di quello sumero, era posizionale, con un grave inconveniente: la mancanza di un simbolo equivalente al nostro zero. Al posto di questo veniva lasciato uno spazio vuoto, ma solo tra due cifre consecutive, mai alla fine del numero. Questo sistema comportava notevoli ambiguità, sia per il fatto che, ad esempio, non è facile distinguere uno spazio vuoto da due spazi vuoti consecutivi, ma anche perchè un simbolo isolato, ad esempio , può in questo modo rappresentare sia il numero uno, che 1 x 60, che 1 x 3600, e così via. L'ambiguità veniva poi risolta caso per caso utilizzando il contesto. La notazione posizionale in base 10 Consideriamo un numero, ad esempio . Viene naturale a chiunque scriverlo mediante delle cifre decimali, ossia utilizzando le cifre , , , , , , , , , , familiari fin dalla scuola elementare. Ma è proprio necessario usare le cifre ? Un numero è proprio la stessa cosa di una espressione scritta mediante delle cifre decimali ? In effetti, il numero potrebbe anche essere scritto , o anche "millenovecentonovantanove", come quando si compila un assegno. Se esistono modi diversi di scrivere quello che, a quanto pare, è lo stesso numero, allora i numeri devono in qualche modo essere indipendenti dal modo in cui li scriviamo. In effetti, quando scriviamo "millenovecentonovantanove" come cose distinte tra loro: , facciamo due Rappresentiamo il numero "millenovecentonovantanove" rispetto alla base . Scriviamo la rappresentazione di questo numero nella base utilizzando un sistema di notazione posizionale. Vediamo in dettaglio cosa significano queste due operazioni: Rappresentare un numero rispetto alla base è un modo (efficace) per rappresentare, ossia, in altre parole, per dare un nome a un numero, decomponendolo in una somma di potenze di 10, ciascuna moltiplicata per una cifra decimale. Ad esempio, il numero "millenovecentonovantanove" viene rappresentato nel modo seguente: ossia, se usiamo per le potenze di dieci la notazione mediante esponenti: (ricordando che per definizione) La rappresentazione del numero è costituita proprio dalle cifre che moltiplicano le potenze di , ossia, nel nostro esempio, dalle cifre 1,9,9,9. Il sistema di notazione che usiamo è posizionale perchè il significato delle cifre dipende dalla loro posizione: nella espressione la prima cifra indica le migliaia, ossia quante volte è contenuto nel numero "millenovecentonovantanove", la seconda cifra indica le centinaia, la terza cifra le decine, la quarta cifra le unità. Consideriamo adesso il numero "novecentodieci". La sua rappresentazione in base è , dove compare ancora la cifra (oltre a e ), ma con significato diverso: la cifra indica ora il numero delle decine, perchè la sua posizione è diversa: mentre prima era la quarta cifra a partire dalla fine, ora è la seconda. Quello che conta è quindi la posizione delle cifre a partire dalla fine, ossia da destra. Confrontiamo con quello che accade invece in un sistema di numerazione non posizionale, ad esempio quello romano: "millenovecentonovantanove" si scrive , e "novecentodieci" si scrive . La cifra qui sta sempre per il numero , indipendentemente dalla posizione, e così pure il significato delle altre cifre non dipende dalla loro posizione (anche se poi il numero rappresentato da una cifra va sommato al precedente o sottratto a quello che segue a seconda della posizione relativa: ad esempio, in si somma dieci a cento, mentre in si sottrae). A questo punto potremmo chiederci: che necessità abbiamo di inventarci un sistema tanto complicato per dare dei nomi ai numeri ? Non bastano i nomi che abbiamo già (ad esempio "millenovecentonovantanove") ? In realtà, i nomi che diamo ai numeri nel linguaggio di tutti i giorni non sono sempre comodi: provate a scrivere usando il liguaggio di tutti i giorni, o anche soltanto a moltiplicare per senza usare le cifre decimali. Rappresentazioni diverse dei numeri hanno scopi e funzioni diverse. Come si dicono i numeri (approfondimento) Ogni lingua naturale incorpora un sistema di numerazione, ossia un sistema per nominare, in modo più o meno sistematico e regolare, i numeri naturali. Lingue diverse adottano, a questo proposito, sistemi molto differenti, a cominciare dalla base. L'italiano utilizza la base , e ha nomi speciali per le potenze di : dieci, cento, mille, un milione .... I nomi dei numeri sono ottenuti combinando questi nomi per le potenze di con i nomi delle unità: uno, due, tre, ... nove. Il risultato è un sistema non eccessivamente irregolare, a parte i nomi delle decine, che invece di essere duedieci, tre-dieci eccetera, sono venti, trenta ecc., e i nomi dei numeri da a , che sono "fusi" in undici (invece di dieci-uno), dodici (invece di dieci-due), ecc., probabilmente per rendere i nomi stessi più brevi (almeno se consideriamo il numero delle sillabe) e più facili da ricordare. Le altre lingue europee seguono anch'esse il principio della base , con analoghe irregolarità, eccetto il francese, che conserva tracce di un'uso (probabilmente di origine celtica) della base , nei nomi per i numeri da a , che si leggono sessanta-dieci, ..., sessanta-diciannove, quattro-venti, quattro-venti-uno, fino a quattro-venti-diciannove. La base è tuttora usata come base principale nelle lingue celtiche ancora esistenti, il gallese e i gaelici irlandese e scozzese. In italiano esistono anche tracce della base (nella divisione delle ore in minuti e dei minuti in secondi) e della base (le uova si contano a dozzine ...). Nelle varie lingue ancora parlate nel mondo, sopravvivono vestigia delle basi 2,3,4,5,6,8,12,20, anche se l'influenza occidentale tende a farle sostituire ovunque con la base . Per quanto riguarda la regolarità, le lingue europee devono cedere il passo a quelle dell'estremo oriente, ad esempio il cinese. In queste lingue, esistono solo nove nomi per le unità da a , più quattro nomi per le potenze 10,100,1000,10000. I nomi dei numeri seguono fedelmente la loro decomposizione in base . Così, ad esempio, si legge dieci-quattro, due-dieci-otto, quattrodiecimila-due-mille-tre-cento-sette-dieci-nove. I tredici nomi usati per le unità e le potenze di dieci sono, in realtà, molto più brevi dei nostri (sono, tipicamente, monosillabici), così che il sistema risulta molto facile e rapido, sia da usare che da imparare. Queste differenze tra le diverse lingue sono significative, e hanno conseguenze non trascurabili. I bambini devono imparare, in età prescolare, le regole di numerazione della lingua materna, semplicemente estrapolandole dagli esempi ascoltati, soprattutto, dai genitori. Un sistema di numerazione più complesso e irregolare è effettivamente più difficile da imparare di uno semplice e regolare, che richiede meno nomi da imparare a memoria e regole semplici da comprendere, come il cinese. Esistono esperimenti che mostrano come, all'età di quattro anni, i bambini americani siano circa un anno indietro rispetto ai loro coetanei cinesi, per quanto riguarda l'apprendimento dei numeri. Inoltre, un sistema come quello adottato dalla lingua cinese, che costruisce i nomi dei numeri attenendosi strettamente alla struttura della loro rappresentazione decimale, rende probabilmente più facile, in seguito, apprendere le regole della scrittura e del calcolo con i numeri in base dieci. La rappresentazione posizionale in base 2 La rappresentazione dei numeri naturali in base è stata descritta da Lebniz all'inizio del '700. Leibniz gli attribuiva grande importanza filosofica, ma dal punto di vista matematico la cosa è rimasta poco più di una curiosità senza rilevanza pratica fino all'invenzione dei calcolatori elettronici, nei quali, invece, la rappresentazione in base è usata universalmente. La ragione sta nella sua massima semplicità di realizzazione mediante circuiti elettronici: poichè in base si usano solo due cifre, uno e zero, per realizzarla in un circuito elettrico sono necessari solo due stati diversi, ad esempio si può rappresentare lo zero con un valore negativo di corrente, l'uno con un valore positivo. In base occorrerebbero invece dieci stati diversi, ad esempio dieci livelli diversi di corrente, il che è decisamente poco pratico da realizzare e difficile da far funzionare. Abbiamo visto che rappresentare un numero in base significa scriverlo come una somma di potenze di , ciascuna moltiplicata per una cifra compresa tra e . Ad esempio, abbiamo visto che il numero viene rapresentato come In base le cose vanno in maniera analoga, con il al posto del , e con due sole cifre, e . Consideriamo ancora il numero . La sua rappresentazione in base è e questo significa che: Qui potrebbero sorgere dei dubbi. Intanto, come si trova questa rappresentazione ? E poi, chi ci dice che tutti i numeri naturali si possono scrivere in questo modo4 ? In base questi problemi, di solito, non si pongono, perchè abbiamo una tale familiarità con la rappresentazione in base da identificarla con i numeri stessi. Per rispondere a queste domande si può fornire un algoritmo che partendo da un numero espresso in base 10, fornisca la sua rappresentazione in base 2. Tale algoritmo è detto Metodo delle divisioni successive. Conversione da binario a decimale Per convertire un numero da base 2 a base 10 si sfrutta semplicemente la definizione di rappresentazione posizionale, moltiplicando ogni cifra per la potenza della base relativa alla posizione della cifra stessa. ES: il numero 101 significa 1 2 2 0 21 1 2 0 , per cui il suo valore è 5. Importante ricordare che nella posizione meno significativa la base deve essere elevata alla 0. Conversione da decimale a binario. Per convertire un numero da base 10 in base 2 si applica un metodo che prende il nome di Metodo delle divisioni successive. Dato il numero da convertire si divide per 2 e si considera il resto (che sarà la cifra meno significativa del nostro risultato), il quoziente si divide a sua volta per 2 e il resto ottenuto sarà la seconda cifra meno significativa e così via. Il procedimento deve essere ripetuto finchè il quoziente è pari a 0. ES: 25 12 6 3 1 0 1 0 0 1 1 Direzione di lettura del risultato 1 0 base 10 (si scrive 25(10)) si esprime come 11001 in base 2. (11001(2)). Il numero 25 in 0 1 In base 2 le potenze del 2 sono rappresentate come le potenze del 10 in base 10: 1 aggiungere uno zero a destra ha l’effetto di raddoppiare il numero di partenza: 10 equivale a 2, 100 è il numero 4, 1000 è 8 e così via. Conversione da decimale a base N e viceversa. Le considerazioni fatte per la conversione in binario sono applicabili a qualsiasi base intera N. Si può convertire in base 3,4,5, etc. Si fa notare che per se per rappresentare un numero in base 2 occorrono 2 cifre, in base 3 ne occorreranno 3. In generale, per rappresentare in base N occorrono N cifre. Se N è piccolo uso poche cifre ma la rappresentazione sarà lunga, se N è grande devo usare più cifre ma posso contare su una rappresentazione più corta. ES: A che numero decimale corrisponde 132(4) ? Per la definizione di notazione posizionale il 32 viene interpretato come 1x42+3x41+2x40, quindi in base 10 il suo valore è 30. La conversione da base decimale a base N si effettua con il metodo delle divisioni successive. ES: 30 7 1 0 2 3 1 Dividendo 30 per 4 si ottiene 7 con resto 2. Dividendo 7 per 4 si ottiene 1 con resto 3. Dividendo 1 per 4 si ottiene 0 con resto 1. 1 0 Si nota che con questo metodo le cifre del risultato possono essere solo 0,1,2,3 0 (ognuna di esse è 1il resto di una divisione per 4). 1 Rappresentazione in base esadecimale. La rappresentazione in base 16 è particolarmente significativa perché, come si vedrà in seguito, permette la rappresentazione di stringhe binarie in modo sintetico. Per rappresentare i numeri in base 16 occorrono 16 cifre: alle 10 cifre arabe si affiancano le prime 6 lettere dell’alfabeto, assegnando ad ognuna di esse il valore in ordine alfabetico: 0 1 2 3 4 5 6 7 8 9 10 A 11 B 12 C 13 D 14 E 15 F Per convertire da esadecimale a decimale, si utilizza la definizione di notazione posizionale: occorre solo ricordarsi che ogni lettera ha un valore specifico. ES: 2AB(16)= 2 x 162 + A x 16 + B x 160 = 2 x 256 + 10 x16 + 11 x 1 = 683 Al contrario, per convertire un valore decimale in esadecimale si applica il metodo delle divisioni successive. ES: 683 42 2 0 16 11(B) 10(A) 2 Solita direzione di lettura del risultato…. Aritmetica digitale I numeri possono essere rappresentati in molti modi diversi. Il calcolatore li rappresenta in base 2. Ovviamente, anche in base 2 si possono eseguire tutte le operazioni che si possono fare in base 10, ma cambiano alcuni dei meccanismi a cui non pensiamo nemmeno più quando calcoliamo a mente. Vediamo come cambiano le 4 operazioni eseguite con numeri in base 2. Somma Per sommare in base 2 bisogna tenere presente che: 0+0=0 0+1=1 1+0=1 1 + 1 = 0 riporto 1 (10, cioè 2 in binario) A questo punto si possono sommare tra loro due numeri: ES: 1 0 10 1 1 + 1 1 0 = 1 1 0 0 1 I due numeri sono 19 e 6, il risultato è 25 Nota: 1+1+1 fa 11 (1 riporto 1). Sottrazione Le regole di base sono: 0-0=0 1 -0 = 1 1 -1 = 0 0 - 1 = occorre organizzare il “prestito” ES: 1 0 10 1 1 1 0 0 = 1 1 0 0 1 I due numeri sono 19 e 4, il risultato è 25 Il difficile viene per operazioni dove i riporti sono ripetuti per molte colonne: 1 0 0 0 0 0 1 = 1 1 1 1 1 Dall’operazione precedente si può inferire che il valore di una sequenza di 1 lunga N (N bits) vale 2N-1. Infatti, sottraendo 1 da un numero formato da un 1 ed N zeri, ottengo una sequenza di N 1. Ma 1 seguito da N zeri in base 2 vale 2N: sottraendo 1 ottengo 2N-1. Moltiplicazione La tavola pitagorica in base 2 è quanto di più semplice si possa immaginare: x 0 1 0 0 0 1 0 1 Quindi la moltiplicazione è un’operazione particolarmente semplice, che il calcolatore può replicare con circuiti di copia e spostamento (shifting) dei dati. ES: 1 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 1 x 1 = 1 - Si lascia al lettore la facoltà di verificare la correttezza di quanto scritto, convertendo in decimale 0 1 Divisione Anche la divisione si basa sulla stessa semplice tavola pitagorica, la logica è la stessa della divisione in decimale. Quindi, attingendo ai vaghi ricordi della scuola elementare il lettore potrà addentrarsi nel seguente esempio (che è semplicemente l’inverso dell’operazione precedente)…. 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 Rappresentazione dei numeri negativi Fino ad ora abbiamo esaminato numeri rappresentati in diverse basi, soprattutto in base 2 che è la base utilizzabile dal calcolatore. Ma come può fare il computer a rappresentare i numeri negativi? Rappresentazione segno-modulo Il computer ha a sua disposizione solo due possibili valori per rappresentare la realtà: 0 e 1. Per rappresentare i numeri negativi si è pensato di rappresentare anche il segno con una di queste 2 cifre: 1 rappresenta il segno – 0 rappresenta il segno + Quindi la rappresentazione 0 101 Rappresenta il numero 5 e 1 101 Rappresenta il numero -5. Si può notare che rappresentando il segno viene meno un bit utilizzabile nella rappresentazione del numero. Il bit utilizzato per rappresentare il segno viene detto ‘bit di segno’. Se con 8 bit posso rappresentare in base 2 i numeri da 0 a 255, in segno-modulo posso rappresentare i numeri da -127 a 127 (un numero di meno…dov’è l’inghippo?). Rappresentazione in complemento a 2 E’ una rappresentazione che permette di rappresentare i numeri negativi in modo differente rispetto al segno-modulo. E’ meno intuitiva della rappresentazione segno/modulo, ma più comoda per il calcolatore. E’ la rappresentazione normalmente adottata per i numeri interi. E definita in questo modo : se il numero è positivo la rappresentazione corrisponde con quella segno/modulo (bit di segno a 0 e rappresentazione del numero in base 2); se il numero è negativo il bit di segno è posto a 1, mentre la rappresentazione del numero è data da 2N- |numero|, dove N è il numero di bit che contiene il modulo del numero(si esclude il bit di segno). ES: 0 101 Rappresenta il numero 5. 1 011 Rappresenta il numero -5. 11 è la rappsentazione binaria di 23-5, cioè 3. Leggere un numero positivo è molto semplice, per leggere un numero negativo dobbiamo pensare che il valore rappresentato in base 2 è 2N- |numero| quindi: |numero| = 2N- valore rappresentato. I numeri rappresentabili in complemento a 2 su N+1 bit (1 bit di segno) sono compresi nell intervallo [-(2N), (2N-1) ] (perché i numeri negativi sembrano essere uno di più…?.) Questa rappresentazione è molto comoda per il calcolatore perché è molto semplice calcolare l’opposto di un numero. Basta cambiare ogni 1 in uno 0 e ogni 0 in un 1 e sommare 1. 0 101 Rappresenta il 5. 1 010 Scambio 0 e 1….. 1 011 …e sommo 1. Ottengo l’opposto di 5. Questo è comodo perché permette di realizzare le sottrazioni utilizzando il circuito sommatore, semplificando il lavoro del calcolatore (invece di sottrarre 5 si può trasformare in -5 e poi sommare). Particolarmente interessante nella rappresentazione in complemento a 2 è la gestione dell’overflow. Per overflow si intende un errore occorso rappresentando un numero troppo grande o troppo piccolo per le risorse di rappresentazione che possediamo. Abbiamo già visto che i numeri in complemento a 2 sono compresi in un certo intervallo, se tentiamo di rappresentare un numero fuori da esso, verrà comunque interpretato come un numero all’interno dell’intervallo. Questo errore è detto errore di overflow. La codifica in complemento a 2 permette al computer di accorgersi di questo tipo di errore: se sommiamo due numeri positivi e la somma risulta troppo grande ce ne accorgiamo perché otteniamo un numero negativo (bit di segno a 1) ES: 0 111 0 101 1 100 Se sommo 5 e 7, il risultato è 12, che non può essere rappresentato in 3 bits. Sommo due numeri positivi ed ottengo un numero negativo…c’è qualcosa che non va! Il risultato viene interpretato come -4. Stesso discorso per quanto riguarda due numeri negativi (con bit di segno a 1) che sommati danno un numero con il bit di segno a 0. Come posso accorgermi di errore se sommo due numeri con bit di segno differenti? (solito inghippo da qualche parte…) Rappresentazione dei numeri reali Abbiamo visto la rappresentazione di numeri interi, positivi e negativi. Ma come si possono rappresentare i numeri ‘con la virgola’? Vediamo anche come viene interpretato un numero con la virgola in base 2: 21 20 2-1 2-2 2-3 1 0, 1 0 1 L’esponente della base continua diminuire dopo la virgola. Il numero raffigurato sopra è 2, 625 (La parte intera non ha bisogno di commento.La parte decimale è 1/2 + 1/8). Per quanto riguarda la conversione in decimale quando si ha un numero inferiore a 1, si usa un metodo particolare detto Metodo delle moltiplicazioni successive. Metodo delle moltiplicazioni successive. Per convertire in base 10 un numero in base 2 con la virgola si deve dividere a metà: la parte intera si converte con il metodo delle divisioni successive, la parte decimale si converte con il metodo delle moltiplicazioni successive: si prende il numero di partenza e si moltiplica per 2: 0,625 x 2 = 1,250 il numero prima della virgola costituisce la prima cifra dopo la vigola del numero convertito: 0,1 Si prende il risultato della moltiplicazione, si leva la cifra prima della virgola e si moltiplica di nuovo per 2: 0,250 x 2= 0,500 la cifra passata prima della virgola è uno 0, che dobbiamo scrivere come seconda cifra dopo la virgola nel numero convertito: 0,10 Si prosegue nello stesso modo: 0,5 x 2 = 1,0 Quindi aggiungo un 1: 0,101 A questo punto il mio numero da moltiplicare è 0, il procedimento è finito. Il procedimento termina anche se contnuando a moltiplicare ottengo un risultato già incontrato in precedenza: questo significa che il numero è periodico. Numeri di rappresentazione finita in decimale possono essere periodici o infiniti in base 2. Rappresentazione in virgola fissa (Fixed point) E’ una rappresentazione che non viene più utilizzata, superata dalla rappresentazione in virgola mobile che vedremo in seguito. 1 0 0 1 1 0 1 0 0 1 Bit di segno Parte intera Parte decimale C’è un bit di segno, dei bits per rappresentare la parte intera e altri bits per rappresentare la parte decimale. La virgola (point, nella notazione anglosassone) viene idealmentge localizzata in un certo punto e permette di rappresentare numeri in formato fisso. Questo è molto comodo per l’esecuzione di operazioni (i numeri sono già ‘incolonnati’) ma limita l’uso della memoria. Se la virgola non fosse ‘prefissata’ potrei rappresentare numeri molto più grandi o molto più piccoli. Rappresentazione in virgola mobile (floating point) La rappresentazione in virgola mobile prevede la rappresentazione del numero in una sorta di ‘notazione scientifica’. Il numero viene rappresentato nella forma 0,xxxxxxx x 2N (lo zero non viene nemmeno scritto per risparmiare memoria). Vengono rappresentate tutte le cifre significative e l’esponente del 2. In questo modo con la stessa memoria posso rappresentare sia numeri molto piccoli che numeri molto grandi. 1 0 0 1 1 0 1 0 0 1 esponente Bit di segno mantissa La rappresentazione dei caratteri. Per carattere si intende una singola lettera, o più genericamente un simbolo come +,*,&, etc. Anche queste informazioni sono rappresentate all’interno del calcolatore, quindi descritte come sequenze di 1 e 0: per rappresentare i caratteri abbiamo bisogno di una corrispondenza tra sequenze binarie e simboli, cioè una codifica. Conosciamo già delle codifiche alfabetiche: il codice Morse ne è un esempio. La codifica ASCII è la più diffusa codifica per la rappresentazione dei caratteri. Tabella dei caratteri ASCII La tabella ASCII (American Standard Code for Information Interchange) è un codice convenzionale usato per la rappresentazione dei caratteri di testo attraverso i byte: ad ogni byte viene fatto corrispondere un diverso carattere della tastiera (lettere, numeri, segni). In realtà lo standard ASCII copre solo i primi 128 byte (da 00000000 a 01111111). I successivi byte fino al 256° costituiscono la tabella ASCII estesa che presenta varie versioni a carattere nazionale. Nella tabella ASCII standard si trovano le cifre numeriche, le lettere maiuscole e minuscole (maiuscole e minuscole hanno codici ASCII differenti) la punteggiatura, i simboli aritmetici e altri simboli ($, &, %, @, #, ecc.). Essendo stata concepita in America, la tabella ASCII standard non comprende le lettere accentate (sconosciute all'ortografia inglese). I primi 32 byte della tabella standard sono inoltre riservati per segnali di controllo e funzioni varie. I Byte da 0 a 31 sono riservati per dei segnali di controllo. Se si sta usando Windows si può ottenere ogni carattere ASCII tenendo premuto il tasto Alt e digitando il codice decimale corrispondente col tastierino numerico. L'alfabeto latino, usato nella scrittura di molte lingue nel mondo, presenta una grande quantità di varianti grafiche: si va dalle semplici vocali accentate (accento grave à, acuto á, circonflesso â, dieresi ä, tilde ã) a lettere modificate (lettere con barrette, cediglie, segni), lettere speciali usate solo in una lingua, segni di punteggiatura particolari (il punto interrogativo ed il punto esclamativo capovolti usati nello spagnolo), simboli di valuta, e così via, senza considerare poi che gran parte di questi segni presentano le due forme maiuscola e minuscola. Le varianti sono talmente numerose che i 128 byte della tabella estesa non sono purtroppo sufficienti a rappresentarle tutte, per questo motivo esistono diverse estensioni della tabella ASCII: lo standard ISO 8859 prevede 15 diverse estensioni, comprese quelle per gli alfabeti diversi dal latino, ma esistono anche ulteriori estensioni non riconosciute dall'ISO e create per esempio dalla Microsoft per i sistemi Windows o dalla Apple per i Macintosh. Persino l'MS-DOS usava un'estensione diversa da quella di Windows. La tabella ASCII estesa tipicamente utilizzata in Italia è quella dell'Europa occidentale, creata per le lingue germaniche e neolatine (escluso il rumeno). Altre estensioni usate in Europa sono la Centro Europea per i paesi dell'Europa orientale (lingue slave, ungherese, rumeno), la Turca, la Cirillica e la Greca. Per cercare di ovviare al problema è stato creato un nuovo standard internazionale detto Unicode, definito dalla Unicode Consortium e dalla International Organization for Standardization (ISO 10646), che rappresenta i caratteri usando 2 byte (16 bit). Con 2 byte il numero di combinazioni possibili diventa 256x256 = 65.536, perciò Unicode supporta 65.536 diversi segni, al posto dei 256 del set ASCII. Si riescono così a rappresentare non solo tutte le varianti dell'alfabeto latino, ma anche tutti gli altri alfabeti (greco, cirillico, arabo, ebraico...) oltre all'insieme degli ideogrammi cinesi e giapponesi (che sono in tutto circa 30.000, anche se poi ne vengono effettivamente utilizzati solo poche migliaia). Lo standard definitivo è ancora in corso di definizione, ma i codici disponibili sono così numerosi, che pare verranno inseriti in Unicode persino gli alfabeti di fantasia come l'Elfico di Tolkien o il Klingon di Star Trek. Lo svantaggio dell'Unicode, rispetto all'ASCII, è che le dimensioni dei file di testo risultano comunque raddoppiate (vengono usati 2 byte per carattere, invece di 1 solo).