Sei sulla pagina 1di 14

CAPITOLO 3

L'ARITMETICA DELL'ELABORATORE

PREMESSA

Questo capitolo è dedicato alla rappresentazione dei dati. Nei primi due paragrafi, vengono
presentati concetti molto importanti: la definizione di dato e informazione, la codifica. Il
terzo paragrafo è dedicato ai sistemi di numerazione. Il capitolo prosegue presentando i
metodi di rappresentazione dei dati, le conversioni numeriche e le operazioni aritmetiche
binarie. Il settimo paragrafo è dedicato alle codifiche alfanumeriche, mentre l'ultimo espone
la rappresentazione esadecimale.

1. I DATI

Con il termine “dato”, nel linguaggio corrente, intendiamo di solito un numero o, se proprio
vogliamo generalizzare, una qualità, una quantità, in ogni caso una caratteristica di un
particolare soggetto od oggetto (prezzo, cognome, colore, altezza, ecc.). In statistica abbiamo
il concetto di matrice dei dati, che in pratica è una tabella rettangolare, dove ogni riga
rappresenta un’unità statistica ed ogni colonna una variabile. Spesso la realtà è molto più
complicata. Il singolo incrocio (data element) è un dato, ossia un’entità quasi sempre non
direttamente utilizzabile se non sottoposta ad un processo di elaborazione che le sintetizzi.
I metadati, o dati sui dati, sono costituiti da tutto ciò che ci è indispensabile per trattare i dati,
cominciando con i nomi, il significato e le caratteristiche delle variabili, dalle modalità che
queste possono assumere, le scale di misura, eccetera, per finire con le modalità e i criteri
che si sono usati per la raccolta dei dati. Dall'elaborazione di dati elementari, o grezzi,
scaturiscono i dati sintetici, che poi, a livello di singolo utente o classi di utenti, si traduce in
informazione, se a livello soggettivo è di interesse (cosa rappresenta informazione varia
infatti da persona a persona, in base al ruolo rivestito, alle funzioni svolte e così via).
Possiamo dire, genericamente che la funzione dell’informazione è di ampliare la conoscenza
e, quindi, di ridurre l'incertezza in merito ad una condizione o evento, spesso in merito a un
processo in corso. L'informazione è definita, infatti, quale strumento di supporto al processo
di decisione in quanto fornisce gli elementi utili alla conoscenza del fenomeno indagato. Ciò
che qualifica un'informazione come “aumento di conoscenza” è il suo rapporto con
l'utilizzatore che, dalla sua interpretazione, deve derivarne un'azione. Poiché l'informazione
nasce dopo che si sono ottenuti dati sintetici elaborazione di dati elementari, analizziamo i
metodi di trattamento e memorizzazione più diffusi per intraprendere un processo di
elaborazione automatica.
Nel linguaggio corrente, un dato viene normalmente espresso in forma letterale, in forma
grafica o in forma numerica, ma quasi sempre in modo non standardizzato, con estrema
variabilità da persona a persona e da caso a caso. Quando ci proponiamo di elaborare i dati

1
è necessario classificarli, ordinarli, elaborarli in modo preciso e le forme di rappresentazione
normalmente usate non si prestano a queste operazioni. Sorge la necessità, quindi, di
esprimere i dati con una serie di caratteri numerici o alfanumerici ben definiti. Questa
operazione si chiama codifica funzionale, che, utilissima nel trattamento manuale e per
preparare i dati al trattamento automatico, non lo è per la loro rappresentazione all’interno
di un sistema elettronico. Infatti, per rappresentare i dati noi utilizziamo il così detto
“alfabeto esterno” che caratteri numerici (quasi sembra a base 10, e quindi composti dalle
cifre da 0 a 9, che possono comprendere il punto decimale ed il segno), alfabetici (utilizzando
i 26 caratteri dell’alfabeto inglese, sia maiuscoli sia minuscoli), logici (con i due valori: vero
e falso), speciali (ad es. /, ; ( :) $ e così via), per non parlare di suoni, immagini, ecc..
Un codice è un riferimento sintetico ed univoco ad un elemento di un gruppo omogeneo di
dati. Esso consente di sintetizzare l'informazione e di identificarla. I vari clienti di
un'azienda, identificabili con nome, cognome e indirizzo, possono essere codificati
attribuendo ad essi un numero progressivo dipendente da un qualche criterio (alfabetico,
cronologico, ...). Il codice di avviamento postale è un esempio diffuso di codice che
sinteticamente, tramite qualche cifra, riesce ad identificare un distretto postale. Altri esempi
di codice li ritroviamo nelle targhe automobilistiche, nei numeri telefonici, nel numero di
articolo dei listini prezzi e così via, sino ad arrivare al numero di matricola di dipendenti e
studenti.
La codifica funzionale presenta molti vantaggi dei quali rileviamo i principali:
a) richiede meno spazio nelle memorie (sostituendo un codice ad un insieme di stringhe
alfanumeriche anche lunghe e poco adatte ad un eventuale trattamento);
b) può rendere più semplici operazioni di raggruppamento e classificazione;
c) normalizza il dato, evitando che una stessa caratteristica sia rappresentata in modo
diverso si pensi, ad esempio, al titolo di studio che se scritto per esteso può presentare
varianti che ne impediscono i riconoscimento univoco.
Purtroppo per rappresentare i dati all’interno degli elaboratori abbiamo a disposizione il
solo alfabeto comprensibile alla circuiteria dell’elaboratore, il così detto “alfabeto interno”
basato su due soli caratteri: 0 e 1, per utilizzare il quale è necessario usare cioè una codifica
tecnologica.
Questo aspetto è trattato nei paragrafi successivi di questo capitolo, dove affrontiamo il
problema della traduzione fra rappresentazione funzionale e rappresentazione tecnologico,
e viceversa, attraverso leggi biunivoche che associno ad ogni carattere dell'alfabeto esterno
una combinazione di cifre binarie.
In pratica per passare dalla codifica funzionale a quella tecnologica, è necessario un processo
di traduzione basato su regole e/o tabelle, come avviene ad esempio, al di fuori del mondo
dell’informatica, con l’uso dell’alfabeto morse, con cui si può passare da un alfabeto di
lettere, cifre, caratteri speciali a uno di soli tre elementi: punto, linea, spazio, e viceversa. Nel
nostro caso si passerà dall’alfabeto esterno a quello interno utilizzando codici di
rappresentazione quali: binario puro, binario floating point, packed, zoned (e per
quest’ultimo le varie convenzioni BCD, ASCII, EBCDIC, …).

2. I SISTEMI DI NUMERAZIONE DECIMALE E BINARIO

Come abbiamo detto nel primo capitolo, la rappresentazione delle quantità ha preceduto
quella della rappresentazione dei testi. Non si tratta solo di eseguire calcoli in modo sempre

2
più rapido e sicuro, ma più esattamente di registrare, elaborare e trasmettere informazioni
di tipo numerico.
Nel nostro paese (e poi in tutto il mondo romano) si è diffuso il sistema di numerazione che
troviamo ancora in molte lapidi di monumenti antichi e medievali: i così detti numeri
romani. Si tratta di un sistema di numerazione non posizionale, dove la cifra zero non è
necessaria.
Da qualche secolo usiamo invece i così detti numeri arabi, di probabile origine indiana, che
a parte la differenza nei simboli (le cifre da 0 a 9 anziché le lettere: I, V, L, C, D, M), è un
sistema posizionale: più esattamente posizionale a base dieci. Tale sistema ha la necessità
della cifra 0, poiché ogni cifra ha un valore diverso in base alla posizione che occupa: la cifra
1 ha un valore diverso se sta al primo o al secondo (partendo da destra) posto di una stringa
di cifre: il primo 1 nella serie 11 ha un valore diverso dal secondo (il primo rappresenta una
decina, il secondo un’unità), mentre nel sistema romano nella sequenza I I (i due I hanno
comunque il valore di uno, come in quella X X i due X hanno entrambi un valore che
equivale al nostro 10).
Ma perché il sistema posizionale scelto ha 10 simboli e non di più o meno? Semplicemente
perché abbiamo 10 dita (che non è ideale, infatti, il numero 10 ha pochi divisori che portino
ad un risultato intero, oltre ad 1 e a se stesso, troviamo solo 2 e 5). Esistono sistemi di
numerazione con basi diverse, ad esempio dodici (fra l’altro con molti divisori: 2, 3, 4, 6) e
venti, di origine europea (latina e celtica) che hanno qualche riscontro anche oggi: si pensi
alle dozzine, alle grosse (dozzine di dozzine), ai numeri francesi dove, ad esempio, 80
corrisponde a quatre-vingts (4 volte 20), novantaquattro è quatre-vingt quatorze, e così via.
Ora, come sappiamo, mentre per costruire calcolatrici meccaniche era possibile e forse più
semplice costruire ruote con 10 denti, per realizzare un elaboratore digitale (considerando
le sue componenti in un numero finito di condizioni) è più semplice, con i circuiti elettronici,
avere 2 condizioni (aperto e chiuso). Questo è un problema? Come abbiamo detto nel
capitolo 1 per esempio della lampadina, sicuramente no, aumenta solo il numero di cifre da
usare (cosa che comunque accadrebbe avendo scartato l’ipotesi di usare l’approccio
analogico.
Come abbiamo appena detto, il sistema decimale utilizza dieci simboli per la sua
rappresentazione (0, 1, ..., 9) il cui valore varia a seconda della posizione che esse occupano.
Ad esempio, il numero 1375 si può rappresentare come

3 2 1 0
1x10 +3x10 +7x10 +5x10

questo significa che il valore delle singole posizioni è funzione delle potenze crescenti del
10, che in questo caso rappresenta la base del sistema di numerazione.
Quindi la cifra generica ha la notazione:

i
n x 10

dove "n" è uno dei caratteri 0, 1, ..., 9 e "i" l'esponente della base (10) che consente di dare un
valore posizionale alla cifra (unità, decine, centinaia, ecc.).
Per quanto riguarda la parte decimale, i pesi delle cifre a destra della virgola corrispondono
alle potenze negative di 10, a partire da -1: le stesse cifre hanno quindi il significato di
decimi, centesimi, millesimi ecc..
Così, ad esempio, 28,321 sarà uguale a:

3
1 0 -1 -2 -3
2x10 +8x10 +3x10 +2x10 +1x10 = 20+8+3/10+2/100+1/1000

Anche il sistema di numerazione binario segue le regole di ogni altro sistema di nu-
merazione, in questo caso la base è due e due sono i simboli utilizzati: 0 e 1. Quindi il valore
di ogni singola cifra all'interno di un numero è dato da una potenza di 2. Perciò la generica
cifra binaria sarà:

i
nx2

dove "n" è uno dei due simboli (0 o 1) ed "i" è l'esponente della base che determina il valore
della cifra (figura 2).
Consideriamo il numero binario 1101 (che si legge uno, uno, zero, uno). Il suo significato è
il seguente:

3 2 1 0
1x2 +1x2 +0x2 +1x2

vale a dire:

8+4+0+1

che corrisponde al numero decimale 13.

I numeri minori di uno si rappresentano, analogamente al sistema decimale, con le potenze


negative di 2.
Consideriamo, per esempio, il numero binario:

1,10010

l'equivalente decimale sarà:

0 -1 -2 -3 -4 -5
1x2 +1x2 +0x2 +0x2 +1x2 +0x2 = 1+1/2+1/16 = 25/16

Per la conversione da decimale a binario si può usare il metodo delle divisioni successive
(usando 2 come divisore), che in pratica consente di trovare i valori che via via residuano
dopo aver sottratto i quadrati di 2: prendendo l'ultimo quoziente ed i resti delle divisioni,
avremo così il numero binario. Ad esempio con 43 avremo:

che ci porta al numero binario 101011.

4
È evidente che con i due soli simboli 0 ed 1, opportunamente combinati, possiamo
rappresentare qualsiasi numero decimale, aumentando però il numero di cifre necessarie.

Oltre a quello binario e decimale possiamo avere altri due sistemi che possono risultare utili,
quelli:
ottale (a base 8) = 0, 1, 2, 3, 4, 5, 6, 7
esadecimale (a base 16) = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F1
Questi due sistemi di numerazione, come possiamo vedere, si possono molto più facilmente
mettere in relazione con quello binario, come si vede dalla seguente tabella:

Decimale Binario Esadecimale Binario Ottale


00 0000 0000 00 00 000 000 000
01 0000 0001 01 00 000 001 001
02 0000 0010 02 00 000 010 002
03 0000 0011 03 00 000 011 003
04 0000 0100 04 00 000 100 004
05 0000 0101 05 00 000 101 005
06 0000 0110 06 00 000 110 006
07 0000 0111 07 00 000 111 007
08 0000 1000 08 00 001 000 010
09 0000 1001 09 00 001 001 011
10 0000 1010 0A 00 001 010 012
11 0000 1011 0B 00 001 011 013
12 0000 1100 0C 00 001 100 014
13 0000 1101 0D 00 001 101 015
14 0000 1110 0E 00 001 110 016
15 0000 1111 0F 00 001 111 017
16 0001 0000 10 00 010 000 020
17 0001 0001 11 00 010 001 021
18 0001 0010 12 00 010 010 022
19 0001 0011 13 00 010 011 023
20 0001 0100 14 00 010 100 024
21 0001 0101 15 00 010 101 025
22 0001 0110 16 00 010 110 026
23 0001 0111 17 00 010 111 027
24 0001 1000 18 00 011 000 030
25 0001 1001 19 00 011 001 031
26 0001 1010 1A 00 011 010 032
31 0001 1111 1F 00 011 111 037
42 0010 1010 2A 00 101 010 052
53 0011 0101 35 00 110 101 065
64 0100 0000 40 01 000 000 100
75 0100 1011 4B 01 001 011 113

Come si può osservare, essendo sia la base 8 sia la base 16 potenze di 2 c’è una
corrispondenza biunivoca rispettivamente fra 3 cifre binarie ed una cifra ottale e fra 4 cifre
binarie ed una cifra esadecimale. Le conversioni sono quindi semplici e veloci. Come
vedremo, un tempo il sistema ottale, ora quello esadecimale servono a rimediare alla
necessaria numerosità delle cifre binarie nella rappresentazione dei valori numerici e a una

1
I caratteri A, B, C, D, E, F sono cifre che aggiunte a le 10 consuete le portano a 16.

5
compatta rappresentazione delle tabelle di rappresentazione dei caratteri. È interessante
notare che il numero 10, in tutte e quattro i sistemi, corrisponde alla rispettiva base di
numerazione, inoltre, diminuendolo di 1 unità si ottiene la cifra più alta fra quelle previste
(1, 7, 9, F). Un numero rappresentato con le stesse cifre, nello stesso ordine, ha valore diverso
in relazione al sistema di numerazione, ossia alla base utilizzata; ad esempio il numero 1345
assume i seguenti valori:
Base utilizzata Valore a base 10
8 (1345)8 1x83+3x82+4x81+5x80 741
10 1345 1x103+3x102+4x101+5x100 1345
16 (1345)16 1x163+3x162+4x161+5x160 4933
Come si può osservare a parità di cifre usate, riportando il valore alla base a noi più
consueta, si nota facilmente che si ha un incremento dello stesso segno di quello della base.

3. OPERAZIONI BINARIE

Per eseguire le operazioni aritmetiche nel sistema di numerazione binario si seguono le


stesse regole del sistema decimale. Ci si può comunque rendere conto della notevole
semplificazione nei calcoli, anche se, come abbiamo già detto, abbiamo un notevole nel
numero di cifre necessario a rappresentare i valori numerici. Tutto questo è comunque
ideale per sistemi veloci, che sono ancora più efficienti quando le operazioni sono semplice
anche se numerose. Uno scolaro che avesse dovuto imparare le tabelline della somma e
ancora di più quelle della moltiplicazione avrebbe avuto un compito molto più facile del
nostro.
Le regole dell'addizione sono:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 con riporto di uno
Esempio:
110100 +
11101 =
---------
1010001
Le regole della sottrazione sono:

0 - 0 = 0
0 - 1 = 1 con prestito di 1 dalla cifra precedente
1 - 0 = 1
1 - 1 = 0
Esempio:
10110001 -
101101 =
----------
10000100

6
Un altro metodo utilizzato per eseguire la sottrazione tra due numeri binari è il metodo della
complementazione. Senza effettuare dimostrazioni matematiche analizziamo come si
realizza in pratica.
Riscriviamo l'esempio precedente aggiungendo al sottraendo due zero non significativi
sulla sinistra:
10110001 -
00101101 =

Si invertono le cifre del sottraendo e si aggiunge il risultato ottenuto al minuendo:

10110001 +
11010010 =
-----------
110000011

Alla somma così ottenuta si toglie la prima cifra a sinistra, per aggiungerla alla sua prima
cifra a destra, cioè:

10000011 +
1
-----------
10000100

Quest'ultimo numero rappresenta la differenza fra 10110001 e 101101.


Questo metodo è molto importante perché consiste in una inversione di stato dei bit ed in
una somma. Così un elaboratore anche per effettuare delle sottrazioni può utilizzare i
circuiti di somma.
Le regole della moltiplicazione sono:

0 x 0 = 0
0 x 1 = 0
1 x 0 = 0
1 x 1 = 1

In pratica il risultato è sempre 0 tranne che nel caso di 1 x 1.


Esempio:

10110101 x
10011 =
--------
10110101
10110101
10110101
--------------
110101101111

Anche la moltiplicazione avviene sommando un certo numero di volte il moltiplicando


incolonnato in dipendenza del contenuto del moltiplicatore. Se ne può dedurre che di nuovo

7
il computer può effettuare una moltiplicazione eseguendo un certo numero di somme.
La divisione tra due numeri binari si svolge con le stesse regole della divisione fra numeri
decimali.
Esempio:
Supponiamo di voler dividere 1101111 per 1111; avremo:
1101111 : 1111
1111 -----
-------- 111
11001
1111
--------
10101
1111
-------
110

Effettuando la riprova per verificare il risultato avremo:


1111 x 111 + 110 = 1101111

Effettuare delle divisioni significa, in pratica, fare una serie di sottrazioni successive. Se
vengono effettuate con il metodo della complementazione di nuovo ci si riconduce ad
eseguire delle conversioni di bit e delle somme. Si può quindi concludere che in sostanza le
varie operazioni aritmetiche si possono effettuare con delle somme e ciò può essere di
importanza notevole nella realizzazione dei circuiti dell'unità logico-aritmetica del com-
puter.

4. RAPPRESENTAZIONE DEI DATI

Come abbiamo accennato alla fine del primo paragrafo e vista la disponibilità di 2 soli
simboli, la codifica tecnologica si dovrà basare su qualcosa di più ampio rispetto alla singola
cifra binaria o BIT (BInary digIT) che rimane l’unità elementare di memorizzazione
dell'informazione, ma che è insufficiente a rappresentare una cifra, un carattere alfabetico o
speciale. Per far questo si deve ricorrere all’uso di uno o più BYTE, ossia di un insieme di
bit (ormai usualmente otto), se non di oggetti più ampi come la così detta WORD (parola)
costituita da 16, 32, 64 o più bit (ma quasi sempre di multipli di otto, ossia di alcuni byte),
anche in base al parallelismo dell’elaboratore utilizzato.
Le principali possibilità che ci vengono offerte per realizzare la codifica tecnologica si
basano su 4 alternative:
1) binario puro,
2) binario floating point,
3) packed,
4) zoned.
Bisogna subito precisare che, mentre per la rappresentazione dei valori numerici possiamo
usare tutte e 4 le forme, per rappresentare i caratteri alfabetici e quelli speciali solo il formato
zoned. In particolare, le due prime modalità, con cui è possibile rappresentare solo valori,

8
prescindono completamente dalla notazione decimale dei numeri. La terza consente di
rappresentare solo valori, ma cifra per cifra (conservando di fatto la natura decimale dei
numeri); questo vale anche per la quarta modalità, che però, come detto, offrendoci 256
combinazioni, permette di esprimere anche caratteri diversi dalle sole cifre.
Cominciando da quest’ultima modalità, è bene precisare che, fino alla seconda generazione
degli elaboratori, il byte era in genere composto da 6 bit (cosa che permetteva di avere solo
26 = 64 combinazioni di 0 ed 1): considerando che l’alfabeto inglese è basato su 26 lettere,
che 10 sono le cifre numeriche, rimanevano 28 caratteri speciali, compreso lo spazio, la
punteggiatura, i simboli aritmetici, ecc.; la codifica utilizzata veniva impropriamente
denominata BCD (binary-coded decimal) proprio perché la rappresentazione dei valori
numerici doveva essere effettuata in binario cifra per cifra, conservando come detto la
natura decimale del numero2. La tabella seguente presenta un esempio di codifica BCD
estesa ai simboli non numerici 3 (considerando il bit 1 all’estrema destra ed il bit 6 all’estrema
sinistra della stringa di 6; ad esempio il numero 3 sarà: 000011, mentre la lettera A: 010001).
Invece di inserire nella prima riga e nella prima colonna 3 cifre binarie avremmo potuto
inserire una solo cifra ottale.

bit 3 2 1
bit 6 5 4 000 001 010 011 100 101 110 111
000 0 1 2 3 4 5 6 7
001 8 9 # @
010 & A B C D E F G
011 H I 0 . ¤
100 - J K L M N O P
101 Q R 0 $ *
110 spazio / S T U V W X
111 Y Z ‡ , %

Mentre l’IBM, con l’avvento della terza generazione di elaboratori, si basava su una codifica
basata su byte ad 8 bit, l’EBCDIC (Extended Binary Coded Decimal Interchange Code, dove
28 = 256), l’avvento dell’elaborazione a distanza rese comunque necessario per tutti
aggiungere altri caratteri all’alfabeto alfanumerico utilizzato: nacque la codifica ASCII
(American Standard Code for Information Interchange) a 7 bit (27 = 128) che includeva anche
i caratteri di controllo richiesti dall’autorità internazionale delle comunicazioni; il primo
standard di questa codifica fu pubblicato dall’ASA (American Standards Association's) nel
1963. Con la nascita dei minicomputer prima e dei personal poi la codifica ASCII, viene
estesa ad 8 bit come quella EBCDIC, anche per adeguarsi all’hardware e diviene uno
standard di uso generale, salvo poche eccezioni legate alle macchine IBM di medio-grandi
dimensioni, visto che anche questa casa costruttrice lo ha adottato per alcuni mini computer
e per i suoi personal computer, sin dall’inizio (nelle successive tabelle sono messi a
confronto queste due codifiche, oltre che la corrispondenza con la rappresentazione binaria,
esadecimale e decimale; il tutto a puro scopo di riferimento).
2
Per la rappresentazione dei valori numerici erano sufficienti 4 bit (visto che 24 = 16 combinazioni bastano a rappresentare
le 10 cifre e i segni dei numeri. Nel mondo scientifico, quando si parla di BCD, spesso ci di riferisce ad una codifica a 4
bit, mentre le case costruttrici utilizzavano questo termine in senso lato, estendendolo a tutta la codifica a 6 bit. Alcuni
elaboratori della seconda generazione (ad es. l’IBM 1620) conservavano una architettura basata su “digit” di 4 bit, anziché
byte di 6, e per rappresentare i caratteri non numerici li accoppiavano 2 a 2, processo che si sarebbe invertito con l’uso
della notazione packed, come vedremo fra poco.
3
Si tratta di quella utilizzata sin dal 1954 dall’IBM 704, il primo elaboratore di massa con circuiti floating point.

9
Decimale Esadecimale EBCDIC  ASCII Binaria Decimale Esadecimale EBCDIC  ASCII Binaria
0 00 NUL NUL 0000 0000 16 10 DLE DLE 0001 0000
1 01 SOH SOH 0000 0001 17 11 DC1 DC1 0001 0001
2 02 STX STX 0000 0010 18 12 DC2 DC2 0001 0010
3 03 ETX ETX 0000 0011 19 13 DC3 DC3 0001 0011
4 04 SEL EOT 0000 0100 20 14 RES/ENP DC4 0001 0100
5 05 HT ENQ 0000 0101 21 15 NL NAK 0001 0101
6 06 RNL ACK 0000 0110 22 16 BS SYN 0001 0110
7 07 DEL BEL 0000 0111 23 17 POC ETB 0001 0111
8 08 GE BS 0000 1000 24 18 CAN CAN 0001 1000
9 09 SPS TAB 0000 1001 25 19 EM EM 0001 1001
10 0A RPT LF 0000 1010 26 1A UBS SUB 0001 1010
11 0B VT VT 0000 1011 27 1B CU1 ESC 0001 1011
12 0C FF FF 0000 1100 28 1C IFS FS 0001 1100
13 0D CR CR 0000 1101 29 1D IGS GS 0001 1101
14 0E SO SO 0000 1110 30 1E IRS RS 0001 1110
15 0F SI SI 0000 1111 31 1F ITB/IUS US 0001 1111

Decimale Esadecimale EBCDIC  ASCII Binaria Decimale Esadecimale EBCDIC  ASCII Binaria
32 20 DS Spazio 0010 0000 48 30 0 0011 0000
33 21 SOS ! 0010 0001 49 31 1 0011 0001
34 22 FS " 0010 0010 50 32 SYN 2 0011 0010
35 23 WUS # 0010 0011 51 33 IR 3 0011 0011
36 24 BYP/INP $ 0010 0100 52 34 PP 4 0011 0100
37 25 LF % 0010 0101 53 35 TRN 5 0011 0101
38 26 ETB & 0010 0110 54 36 NBS 6 0011 0110
39 27 ESC ' 0010 0111 55 37 EOT 7 0011 0111
40 28 SA ( 0010 1000 56 38 SBS 8 0011 1000
41 29 SFE ) 0010 1001 57 39 IT 9 0011 1001
42 2A SM/SW * 0010 1010 58 3A RFF : 0011 1010
43 2B CSP + 0010 1011 59 3B CU3 ; 0011 1011
44 2C MFA , 0010 1100 60 3C DC4 < 0011 1100
45 2D ENQ - 0010 1101 61 3D NAK = 0011 1101
46 2E ACK . 0010 1110 62 3E > 0011 1110
47 2F BEL / 0010 1111 63 3F SUB ? 0011 1111

Decimale Esadecimale EBCDIC  ASCII Binaria Decimale Esadecimale EBCDIC  ASCII Binaria
64 40 Spazio @ 0100 0000 80 50 & P 0101 0000
65 41 RSP A 0100 0001 81 51 Q 0101 0001
66 42 B 0100 0010 82 52 R 0101 0010
67 43 C 0100 0011 83 53 S 0101 0011
68 44 D 0100 0100 84 54 T 0101 0100
69 45 E 0100 0101 85 55 U 0101 0101
70 46 F 0100 0110 86 56 V 0101 0110
71 47 G 0100 0111 87 57 W 0101 0111
72 48 H 0100 1000 88 58 X 0101 1000
73 49 I 0100 1001 89 59 Y 0101 1001
74 4A J 0100 1010 90 5A ! Z 0101 1010
75 4B . K 0100 1011 91 5B $ [ 0101 1011
76 4C < L 0100 1100 92 5C * \ 0101 1100
77 4D ( M 0100 1101 93 5D ) ] 0101 1101
78 4E + N 0100 1110 94 5E ; ^ 0101 1110
79 4F | O 0100 1111 95 5F _ 0101 1111

Decimale Esadecimale EBCDIC  ASCII Binaria Decimale Esadecimale EBCDIC  ASCII Binaria
96 60 - ` 0110 0000 112 70 p 0111 0000
97 61 / a 0110 0001 113 71 q 0111 0001
98 62 b 0110 0010 114 72 r 0111 0010
99 63 c 0110 0011 115 73 s 0111 0011
100 64 d 0110 0100 116 74 t 0111 0100
101 65 e 0110 0101 117 75 u 0111 0101
102 66 f 0110 0110 118 76 v 0111 0110
103 67 g 0110 0111 119 77 w 0111 0111
104 68 h 0110 1000 120 78 x 0111 1000
105 69 i 0110 1001 121 79 ` y 0111 1001
106 6A j 0110 1010 122 7A : z 0111 1010
107 6B , k 0110 1011 123 7B # { 0111 1011
108 6C % l 0110 1100 124 7C @ | 0111 1100
109 6D _ m 0110 1101 125 7D ' } 0111 1101
110 6E > n 0110 1110 126 7E = ~ 0111 1110
111 6F ? o 0110 1111 127 7F " DEL 0111 1111

10
Decimale Esadecimale EBCDIC  ASCII Binaria Decimale Esadecimale EBCDIC  ASCII Binaria
128 80 1000 0000 144 90 DLE 1001 0000
129 81 a 1000 0001 145 91 j 1001 0001
130 82 b 1000 0010 146 92 k 1001 0010
131 83 c 1000 0011 147 93 l 1001 0011
132 84 d 1000 0100 148 94 m 1001 0100
133 85 e 1000 0101 149 95 n 1001 0101
134 86 f 1000 0110 150 96 o 1001 0110
135 87 g 1000 0111 151 97 p 1001 0111
136 88 h 1000 1000 152 98 q 1001 1000
137 89 i 1000 1001 153 99 r 1001 1001
138 8A 1000 1010 154 9A 1001 1010
139 8B 1000 1011 155 9B 1001 1011
140 8C 1000 1100 156 9C 1001 1100
141 8D 1000 1101 157 9D 1001 1101
142 8E 1000 1110 158 9E 1001 1110
143 8F 1000 1111 159 9F 1001 1111

Decimale Esadecimale EBCDIC  ASCII Binaria Decimale Esadecimale EBCDIC  ASCII Binaria
160 A0 1010 0000 176 B0 ^ 1011 0000
161 A1 ~ 1010 0001 177 B1 1011 0001
162 A2 s 1010 0010 178 B2 1011 0010
163 A3 t 1010 0011 179 B3 1011 0011
164 A4 u 1010 0100 180 B4 1011 0100
165 A5 v 1010 0101 181 B5 1011 0101
166 A6 w 1010 0110 182 B6 1011 0110
167 A7 x 1010 0111 183 B7 1011 0111
168 A8 y 1010 1000 184 B8 1011 1000
169 A9 z 1010 1001 185 B9 1011 1001
170 AA 1010 1010 186 BA 1011 1010
171 AB 1010 1011 187 BB 1011 1011
172 AC 1010 1100 188 BC 1011 1100
173 AD [ 1010 1101 189 BD ] 1011 1101
174 AE 1010 1110 190 BE 1011 1110
175 AF 1010 1111 191 BF 1011 1111

Decimale Esadecimale EBCDIC  ASCII Binaria Decimale Esadecimale EBCDIC  ASCII Binaria
192 C0 { 1100 0000 208 D0 } 1101 0000
193 C1 A 1100 0001 209 D1 J 1101 0001
194 C2 B 1100 0010 210 D2 K 1101 0010
195 C3 C 1100 0011 211 D3 L 1101 0011
196 C4 D 1100 0100 212 D4 M 1101 0100
197 C5 E 1100 0101 213 D5 N 1101 0101
198 C6 F 1100 0110 214 D6 O 1101 0110
199 C7 G 1100 0111 215 D7 P 1101 0111
200 C8 H 1100 1000 216 D8 Q 1101 1000
201 C9 I 1100 1001 217 D9 R 1101 1001
202 CA 1100 1010 218 DA 1101 1010
203 CB 1100 1011 219 DB 1101 1011
204 CC 1100 1100 220 DC 1101 1100
205 CD 1100 1101 221 DD 1101 1101
206 CE 1100 1110 222 DE 1101 1110
207 CF 1100 1111 223 DF 1101 1111

Decimale Esadecimale EBCDIC  ASCII Binaria Decimale Esadecimale EBCDIC  ASCII Binaria
224 E0 \ 1110 0000 240 F0 0 1111 0000
225 E1 1110 0001 241 F1 1 1111 0001
226 E2 S 1110 0010 242 F2 2 1111 0010
227 E3 T 1110 0011 243 F3 3 1111 0011
228 E4 U 1110 0100 244 F4 4 1111 0100
229 E5 V 1110 0101 245 F5 5 1111 0101
230 E6 W 1110 0110 246 F6 6 1111 0110
231 E7 X 1110 0111 247 F7 7 1111 0111
232 E8 Y 1110 1000 248 F8 8 1111 1000
233 E9 Z 1110 1001 249 F9 9 1111 1001
234 EA 1110 1010 250 FA 1111 1010
235 EB 1110 1011 251 FB 1111 1011
236 EC 1110 1100 252 FC 1111 1100
237 ED 1110 1101 253 FD 1111 1101
238 EE 1110 1110 254 FE 1111 1110
239 EF 1110 1111 255 FF 1111 1111

11
Anche se non serve certamente imparare a memoria queste tabelle, sono molto utili anche
per alcune considerazioni che si possono fare. Come si vede la codifica ASCII è stata limitata
a quella base. La rappresentazione binaria (di 8 bit) si può considerare divisa in due parti,
ognuna delle quella corrisponde in modo biunivoco ad una cifra esadecimale; la parte di
sinistra è detta “zona”, mentre quella di destra “digit”. Nella codifica ASCII i numeri (hanno
zona uguale a 3, ossia 0011) precedono le lettere, mentre avviene l’inverso per l’EBCDIC (la
zona è F, ossia 1111); questo incide anche sull’ordinamento alfanumerico degli archivi. Il
valore decimale ci è utile, oltre che come progressivo e decodifica, anche per l’immissione
dei caratteri non compresi nella tastiera (attraverso l’uso il tasto Alt e del tastierino
numerico).
Per aumentare il numero dei caratteri rappresentabili, si utilizza la “famiglia” UNICODE,
con codifiche che partendo da quella uguale alla ASCII (standard UTF-7) possono arrivare
ad essere basate su 16 o 32 bit.
Tornando al discorso precedente sulle zone e i digit, diventa semplice presentare la
rappresentazione packed. Nel caso si vogliano rappresentare solo caratteri numerici (senza
perdere la natura decimale dei numeri) diventa uno spreco rappresentare ogni singola cifra
con un byte intero; possiamo rappresentare ogni valore numerico con un semi-byte, ossia
solo 4 bit; anche la così detta zona può contenere una cifra come il digit (in pratica si dimezza
o quasi, in base al fatto che le cifre del campo siano pari o dispari, incluso il segno,
l’occupazione in memoria centrale, in quelle ausiliarie, in trasmissione dati, ecc.. Questo tipo
di rappresentazione, introdotta per le elaborazioni tipicamente aziendali aveva portato a
circuiterie specializzate per effettuare le operazioni aritmetiche utilizzandola direttamente
senza convertirla i valori in uno dei due formati binari che stiamo per presentare.
Le rappresentazioni binarie, sia quella pura sia floating point, non conservano la natura
decimale dei numeri trattati. Con quella pura si possono rappresentare solo valori interi e
con un limite determinato dalla dimensione della “parola” utilizzata. In pratica, il valore
massimo rappresentabile dipende dal numero di bit a disposizione; supponendo di
utilizzare una parola di 4 byte, avremo a disposizione 32 bit con cui rappresentare il valore
numerico: stabilito che un bit va dedicato al segno (positivo se 0, negativo se 1), rimangono
31 bit, che ci consentono 231 combinazioni (considerando che fra i valori con segno positivo
c’è anche lo zero, si arriverà a poter rappresentare come numero massimo 231-1 ossia,
2147483647, avendo come minimo -2147483648). Il problema non è costituito soltanto da
questi limiti, già di per se non certo elevati, ma soprattutto dal fatto che, se superati
(situazione detta di overflow), si ottiene un risultato errato senza che venga nemmeno
segnalato. Ad esempio, sommando 2 miliardi con due miliardi non otteniamo 4 miliardi,
bensì un numero negativo (visto che il numero ottenuto, non potendo essere contenuto in
31 bit, va a invadere il campo del segno e lo fa diventare 1, ossia negativo.
Per rappresentare numeri molto grandi o molto piccoli e, in ogni caso, per quelli non interi,
dobbiamo utilizzare la rappresentazione floating point, che rappresenta un compromesso
fra limite dei valori e precisione. In questo caso si usa una rappresentazione logaritmica dei
numeri, una parte della parola viene riservata alla mantissa ed un’altra alla caratteristica.
La precisione di rappresentazione è data dal numero di cifre esprimibili nella mantissa,
mentre l’ordine di grandezza del valore si ottiene tramite la caratteristica (esponente); c’è
ovviamente anche il segno, che utilizza un bit. La rappresentazione della mantissa si ottiene
con esponenti negativi della base di numerazione, che portano ad avere un numero inferiore
ad 1, con 7 cifre (nel caso di mantissa di 24 bit, nel caso di parole di 32 bit, i soliti 4 byte) fino
a 16 (usando parole di 64 bit e mantissa di 53 bit, in questo caso di parla di rappresentazione

12
in doppia precisione). In ogni caso non si verifica il problema dell’overflow, sopra descritto,
nella mantissa vengono sempre conservate le cifre più significative e la caratteristica ci dà
l’ordine di grandezza. Può risultare utile fare un esempio, non utilizzando però l’aritmetica
e le basi binarie ma quelle decimali cui siamo abituati. Supponendo di voler rappresentare,
in questa forma esemplificativa, il valore 234765, avremo, una caratteristica pari a 6 ed una
mantissa pari a .234765 che ci porterà ad avere un valore pari a: 106 × .23475 ossia: 234765.
Similmente, per il valore 45.3792, avremo caratteristica 2 e mantissa .453792 che ci porterà a
102 × .453792 che ci porta esattamente al valore di partenza. In realtà, come detto, sia la
mantissa sia la caratteristica sono espresse in forma binaria; la caratteristica sarà negativa
per valori piccoli (inferiori a 1) e zero o positiva per gli altri. Non è comunque tempo perso
esaminare questo esempio, poiché la rappresentazione esponenziale dei numeri a base 10 è
utilizzabile effettivamente a livello di codifica funzionale, sia per dati in ingresso, sia in
uscita, sia per esprimere valori costanti molto elevati o molto piccoli nei programmi; ci
consente di avere una notazione compatta che può risultare utile.
L’aspetto negativo di questo tipo di notazione è costituito dal fatto che sia la
rappresentazione sia i calcoli risentono del livello di precisione (semplice, doppia, ed oltre);
a volte un errore anche piccolo (a destra della stringa) in base alle caratteristiche del numero,
può estendersi verso sinistra, finché non diviene ininfluente.

5. ORGANIZZAZIONE DEI DATI

Concludiamo questo capitolo con brevissimi cenni all’organizzazione dei dati. Come
abbiamo accennato, i dati sono costituiti da simboli numerici e/o alfabetici e/o; per poter
essere trattati tramite un sistema di calcolo automatico, devono essere organizzati in
strutture standard e con formato predefinito.
L’organizzazione dei dati prevede una struttura gerarchica che, dal livello maggiore verso
quello inferiore, si può esemplificare così:
• “file” (archivio) costituito da un insieme di record;
• “record” (registrazione) si riferisce ad una specifica entità (soggetto o oggetto): è
composto da un insieme ordinato di campi riferiti logicamente a tale entità (in statistica
equivale ad un’unità d'osservazione); i record possono essere a lunghezza fissa o a
lunghezza variabile4;
• “campo” composto da un insieme di caratteri, il cui numero determina l’ampiezza (in
byte), che contiene un dato ben definito (in statistica il valore o la modalità che assume
una variabile a livello di una unità di osservazione); fra i campi assumono particolare
importanza quelli che permettono l’identificazione del record (ad esempio: la matricola,
il codice comune, il codice merceologico, numero d’ordine, cognome, ecc.).
Possiamo aggiungere, verso il basso, il “byte” (componente del campo) e poi il “bit”
(componente del byte), mentre verso l’alto si può inserire il “data base”, in quanto costituito
da un insieme di file.

4
In questa descrizione ci riferiamo al record logico, che non necessariamente corrisponde al record fisico, ossia a quanto
viene scritto sul o letto dall’unità di memoria ausiliaria; di solito il record fisico ha una lunghezza fissa stabilita dal sistema
operativo che gestisce la macchina (e si basa su blocchi, che in genere sono di 512, 1024 o 2048 byte). La lunghezza del
record logico determinerà quanti si potranno inserire in un record fisico o se saranno necessari più record fisici per la sua
memorizzazione. La lettura di blocchi standard facilita, e spesso velocizza, le operazioni di input/output (cosa che era
ancora più rilevante nel caso dei nastri magnetici).

13
I file possono essere classificati in base a varie caratteristiche. Un’importante distinzione è
quella che li classifica in base ai criteri con cui si può accedere ad un singolo record:
• archivi ad organizzazione sequenziale;
• archivi ad organizzazione ad accesso diretto (denominata anche casuale o random),
realizzabile solo su dispositivi hardware che hanno tale caratteristica, come le unità a
disco;
• archivi ad organizzazione mista, anche questa realizzabile solo su dispositivi hardware
che consentono l’accesso diretto ad una specifica parte del supporto (in questo caso però
avremo un file memorizzato sequenzialmente ma ordinato in base ad una chiave e con
indici che guidano l’accesso al singolo record: in pratica vengono indicante tramite
tabelle i limiti delle chiavi dei record, prima per unità, poi per cilindro, fino ad arrivare
alla traccia).
Ogni tipo di organizzazione ha pregi e difetti. Quella sequenziale è inefficiente quando non
si voglia elaborare un archivio nell’ordine con cui è stato memorizzato: come nel caso delle
procedure che ricercano un singoli record, senza seguire l’ordine con il quale l’archivio è
stato memorizzato; in compenso si ha il massimo risparmio del supporto di memoria
utilizzato e, se si usa un hardware ad accesso sequenziale (come lo erano i nastri magnetici)
si ha anche una notevole velocità di trasferimento dei dati), mentre utilizzando, come spesso
accade, una unità a disco perdiamo parte di questo vantaggio. Quella ad accesso diretto se
usata in modo “puro” lasciando cioè sul supporto lo spazio per tutti i potenziali record in
base a tutti i possibili valori del campo usato come chiave porta ad un notevole spreco di
spazio 5, ma consente un veloce accesso al singolo record; nel caso si debba usare un archivio
di questo tipo in modo sequenziale la velocità di trasferimento non è certo ottimale.
L’organizzazione sequenziale con indici permette di trovare un compromesso fra le due
precedenti. Essendo il file memorizzato in base ad una chiave, ma senza lasciare spazio per
ipotetici inserimenti di record, non si hanno sprechi nell’uso del supporto; l’accesso avviene
solo dopo la consultazione delle citate tabelle indice, di cui solo la prima è in memoria,
limitando così la perdita di tempo, operazione che richiede più accessi, sia pure random, al
supporto: il risultato è costituisce generalmente un buon compromesso; quando però si
devono inserire nuovi record, non avendo spazi riservati, si devono registrare in fondo al
file, perdendo quindi, via via sempre di più, il vantaggio dell’accesso tramite indice: per
questo gli archivi di questo tipo vanno sottoposti a periodiche riorganizzazioni che
ripristinano la registrazione sequenziale, riportando i tempi di accesso in limiti accettabili.
Per quanto riguarda la cancellazione di record, in quasi tutti i casi si tratta di una
cancellazione virtuale e non fisica, che lascia il record al suo posto, ma lo segna come
cancellato modificando, ad esempio, uno specifico bit, fino alla successiva riorganizzazione,
durante la quale viene definitivamente eliminato.
Un discorso a parte meriterebbero le basi di dati, che stanno divenendo lo standard in molti
campi applicativi. Ci limitiamo definirla semplicemente come un’ampia raccolta di dati
organizzati, con l’obiettivo di una ricerca ed un recupero rapidi, anche attraverso una
molteplicità di chiavi.
In campo statistico quasi sempre gli archivi vengono utilizzati sequenzialmente dall’inizio
alla fine senza dare quasi mai rilievo ad una singola unità di osservazione; questo fatto
continua ad influenzare profondamente, anche oggi, le caratteristiche del software statistico
standard, basati molto spesso sulla lettura e registrazione sequenziale degli archivi.

5
Apposite formule, dette di randomizzazione, applicate alla chiave, consentono di limitare questo problema.

14