3         Codifica e rappresentazione dei dati

Un byte può contenere 256 configurazioni possibili, come rappresentazione numerica binaria un numero fra 0 e 255. La rappresentazione del valore dei bytes può essere fatta in diversi modi:

Come sequenza di 0 ed 1:                               01010011 01111011 01101111
Come sequenza di valori decimali:                    83 123 111
Come sequenza di valori esadecimali:               53 7B 6F
Come caratteri ISO ASCII                              S  { o

Per rendere utilizzabile ai fini pratici i risultati delle elaborazioni del computer e permettere l’interazione uomo – computer tramite tastiere, video, stampa, ecc…, ogni byte, se trattato come carattere e non come numero, è codificato secondo lo standard  ISO ASCII [1] . Tale standard utilizza 7 bit per codificare i numeri decimali, le lettere maiuscole e minuscole, i segni di interpunzione, alcuni segni tipografici e caratteri di controllo per la stampa. Utilizzando anche l’ottavo bit, come nel PC, si ottengono altri 128 caratteri, utilizzati per l’estensione agli alfabeti nazionali e segni particolari.

Per alfabeti ad ideogrammi, come il cinese o il giapponese (KANA), si utilizza una codifica su 2 byte (UNICODE).

Figura 31

CODIFICA ISO ASCII  DI ALCUNI CARATTERI

Carattere

Codifica esadecimale

Valore decimale

(spazio) ! “ £ $

20 21 22 23 24

32 33 34 35 36

0 1 ...9

30 31  ... 39

48 49 ... 57

A B ...Z

41 42 ... 5A

65 66 ... 90

a b ... z

61 62 ... 7A

97 98 ... 122

@

40

64

CR (Carriage Return) LF (Line Feed) FF (Form Feed)

0D 0A 0C

13 10 12

BREAK (Control C)

03

3

BELL

07

7

STX

02

2

ETX

03

3

ACK

06

6

NACK

15

21

DC3

13

19

DC4

14

20

3.1        Formato nativo dei dati

Nella memoria del calcolatore ci sono sequenze di bytes che hanno un significato per il programma che li elabora, quindi un insieme di bytes può contenere indifferentemente una stringa di caratteri, dei numero o delle istruzione di macchina.

Le istruzioni di macchina che spostano i bytes da una locazione di memoria ad un’altra trattano questi come caratteri, le istruzioni aritmetiche trattano un certo numero di bytes consecutivi interpretandoli come numeri, se ad esempio in due bytes ci sono i caratteri ASCII  “0A”, in stampa si avrà “0A”, ma stampati come numero intero si otterrà 16688 [2] .

3.1.1            Numeri

3.1.1.1              Numeri interi

Sono formati da 1, 2  o 4 byte consecutivi. Di essi un bit indica il segno ed i restanti rappresentano il numero binario.

3.1.1.2              Numeri floating point o virgola mobile

I numeri floating point servono per il calcolo tecnico scientifico poiché possono esprimere valori molto piccoli o molto alti: ±N*10±m.  dove N è detta Mantissa ed è un valore fra 1 e 9,999..., m è l’esponente di 10 ad esempio:

Numero

Notazione in virgola mobile

559876543290290000

5.5987654329029E+17

-0.00000000009876543

-9.876543E-11

In genere i numeri floating point utilizzano 4bytes, in semplice precisione o 8 bytes in doppia precisione. Con i numeri in virgola mobile a semplice precisione si possono esprimere numeri negativi da -3,402823E38 a -1,401298E-45 e numeri positivi da 1,401298E-45 a 3,402823E38.

3.1.1.3              Numeri packed

I numeri packed sono una codifica di numeri interi utilizzata su sistemi IBM 370. Occupano da 1 ad 16 byte. Ogni carattere contiene due cifre numeriche codificate  da 0000 a 1001 (da 0 a 9), l'ultimo byte a destra contiene una cifra ed il segno. Il segno è positivo se il semibyte contiene il valore (esadecimale) A, C, E o F, negativo se contiene B o D.

Con i numeri packed si possono esprimere fino a 31 cifre.

3.1.1.4              Puntatori

I puntatori contengono indirizzi di memoria, la dimensione di un puntatore dipende dal calcolatore.

3.2        Tipi di dati derivati

I tipi di dato e le istruzioni messi a disposizione del calcolatore, sono la base per realizzare, a livello di programmazione, ulteriori tipi di dato e relative operazioni su di essi, ed è ciò che molti strumenti di gestione di dati fanno (linguaggi di programmazione, fogli elettronici, DataBase, ecc..). Ad esempio il tipo di dati coordinate spaziali potrebbe essere realizzato da tre numeri floating point.

3.2.1            Numeri con decimali

Si possono realizzare in alcuni modi diversi. In COBOL  i numeri sono dichiarato con un certo numero di decimali, il compilatore, che utilizza istruzioni aritmetiche su numeri interi, genera tali istruzioni tenendo conto del numero di decimali voluti, ad esempio se il campo IMPORTO, definito con tre decimali, contiene 320.1, nella memoria ci sarà il numero 320100, l’istruzione che somma 150 all’IMPORTO, in realtà sommerà 150000.

Altri linguaggi di programmazione prevedono tipi di dato con numero fisso di decimali (tipo di dato currency); essi sono realizzati con un certo numero di bit: un bit determina il segno, una parte di bit determina il valore decimale, i bit rimanenti individuano il valore intero.

3.2.2            Date

Date e ore sono memorizzate in 8 bytes, 4 per la data, e 4 per l’ora. In Oracle® le date possono variano dal 1 gennaio 4712 AC al 31 Dicembre 4712 DC; in Visual Basic® dal 1 gennaio 100 al 31 dicembre 9999.

3.2.3            Insiemi di caratteri

E’ il tipo di dato per informazioni descrittive, ci si riferisce ad esso anche col nome di stringhe o dati alfanumerici.

Questi tipi di dato sono realizzati nei linguaggi di programmazione in modi diversi, il più semplice è quello di accettarli solo con lunghezza fissa. Nel linguaggio C le stringhe, pur essendo dichiarate di lunghezza fissa, sono terminate con il carattere con valore esadecimale "00", ottenendo di fatto una limitata gestione di stringhe a lunghezza variabile. Nel linguaggio Basic le stringhe sono di lunghezza variabile, la loro struttura è formata da dei caratteri che contengono la lunghezza della stringa, seguiti dalla stringa stessa (formato BSTR). Quando si varia la lunghezza di una stringa il programma colloca la stringa variata in coda allo spazio dedicato alla memorizzazione delle stringhe. Se lo spazio è esaurito viene attivato un meccanismo di recupero degli spazi detto garbage collection.

3.2.4            Tipi di dati universali

Sono i tipi di dati detti variant, il linguaggio di programmazione ne determina il tipo in funzione dell'utilizzo che ne viene fatto. Sono utilizzabili per stringhe, numeri e date.

3.2.5            Dati complessi

3.2.5.1              Matrici e tabelle

Le matrici sono strutture contenenti occorrenze multiple di dati dello stesso tipo; la singola informazione è individuata dal nome della matrice e da uno o più indici che sono le coordinate della sua posizione nella matrice. Le matrici possono avere più dimensioni, quelle con una dimensione sono dette matrici lineari o vettori.

Un tipo particolare di matrici sono le matrici associative [3] . Nelle matrici associative ogni elemento è individuato da una chiave, che è il mezzo per accedere al suo valore.

Le tabelle sono simili alle matrici bidimensionali, ma le colonne possono contenere tipi di dato diversi. Se il linguaggio di programmazione non permette di dichiarare matrici non omogenee, occorre utilizzare matrici di stringhe di caratteri, ed effettuare la conversione dei dati dalla rappresentazione in formato carattere a quella voluta. Ad esempio una tabella con consumi mensili di acqua, luce e gas sarà formata da una matrice di stringhe di dimensioni 12 x  4, in cui  la prima colonna contiene il nome del mese e le successive i consumi mensili.

3.2.5.2              Liste

Le liste sono delle strutture di dati comuni a molti linguaggi; nella loro forma più generale sono una collezione di oggetti, ognuno dei quali è o un oggetto elementare o una lista o un insieme vuoto. La definizione in termini di generazione di linguaggio è:

L → {Testa, Coda}                      

Testa →  oggetto | { }

Coda →  L | { }

Le operazioni di base su una lista sono l'estrazione del primo elemento (la Testa), l'inserimento di un elemento (una nuova Testa). I linguaggi che prevedono le liste hanno generalmente un insieme di   operazioni per inserire, modificare o cancellare elementi o parti di una lista, e l'individuazione degli elementi per posizione.

Le liste sono strutture flessibili ed adatte a rappresentare alberi, matrici, code, stack, ecc…

3.2.5.3              Record

I record descrivono stringhe di dati contenenti dati elementari, anche d tipo diverso. Sono strutture introdotte nel COBOL, e si prestano a descrivere il contenuto degli archivi tradizionali.

3.2.6            Rappresentazione di dati e delle relazioni fra di essi

Un esempio di questo tipo di dati è la rappresentazione di un albero binario, esso si può realizzare con un insieme di terne di dati, in cui il primo dato della terna è l'informazione, gli altri due sono i puntatori rispettivamente alla terna successiva a destra e a sinistra. Il valore 0 nel puntatore destro o sinistro, indica che non ci sono successori a destra o a sinistra.


3.3        Indici.

[4] . Per ricercare l'informazione, si calcola la funzione numerica e si verifica nella tabella la presenza della chiave. I sinonimi si cercano nei successivi elementi della tabella. Se si raggiunge un elemento non occupato,  l'informazione non è presente. Il punto cruciale degli indici Hash è trovare una funzione che produca un ridotto numero di sinonimi.

3.3.2            Indici B-Tree

A differenza delle tecniche di indicizzazione viste in precedenza che presuppongono chiavi senza o quasi sinonimi, gli indici bit mapped si utilizzano per reperire informazioni tramite una parte di essa con poca variabilità, ad esempio per trovare le automobili rosse: per ogni valore possibile del colore c'è una stringa di bit lunga quante sono le informazioni nell'archivio; l’n-esimo bit della stringa relativa a ROSSO contiene 1, se nell'n-esima informazione il colore è ROSSO. Il modo in cui gli indici bit mapped sono costruiti li rende adatti a ricerche su più caratteristiche, ad esempio se c'è anche un indice bit mapped per il tipo di automobile, le automobili FUORISTRADA ROSSO si ottengono dall' AND della stringa relativa a colore ROSSO con quella relativa a tipo FUORISTRADA.



[1] Esistono anche altre codifiche, la più famosa è la codifica EBCDIC utilizzata sui calcolatori IBM 370, e AS400

[2] Questo nei sistemi con microprocessore INTEL, in cui il byte con i valori più significativi è a destra.

[3] in alcuni linguaggi di programmazione sono chiamate dizionari

[4] Si possono anche utilizzare altre tecniche, come memorizzare i sinonimi in una seconda tabella.