La codifica dell`informazione

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).