La codifica di numeri e caratteri alfanumerici

 

1 - Introduzione

Il computer può essere definito come una macchina che riceve in ingresso (input) delle informazioni, le elabora in base ad un determinato procedimento e quindi produce dei risultati che vengono portati in uscita (output). Per informazione intendiamo tutto ciò che il cervello umano è in grado di percepire e a cui viene dato un particolare significato.
Col termine informazione intendiamo quindi: numeri, parole, immagini, suoni, filmati, ecc.
Si pone quindi il problema di rappresentare queste informazioni in modo che il computer possa recepirle ed elaborarle.  Sappiamo che il computer utilizza soltanto l'alfabeto binario. Vediamo quindi come è possibile trasformare tutti i tipi d'informazione in numeri binari.

2 - La codifica dei numeri interi

I numeri interi vengono codificati utilizzando un numero limitato di byte che, a secondo dei casi, possono essere 1, 2 o 4; ne consegue quindi che per codificare i numeri interi si possono avere a disposizione stringhe di bit della lunghezza di 8, 16 o 32.Poiché l'alfabeto binario dispone soltanto di due simboli (0, 1) si pone subito il problema di trovare una convenzione per rappresentare i numeri negativi. In origine vennero adottati due metodi denominati:

In seguito il metodo Modulo e segno venne abbandonato ed attualmente si utilizza quasi sempre il metodo complemento a 2.

2.1 - Rappresentazione con modulo e segno

In questo tipo di rappresentazione, il primo bit a sinistra rappresenta il segno del numero e gli altri il suo valore assoluto. In particolare il bit di segno assumerà il valore 0 per i numeri positivi e 1 per quelli negativi.

Riportiamo alcuni esempi nella configurazione a 16 bit:

42

0

0

0

0

0

0

0

0

0

0

1

0

1

0

1

0

-42

1

0

0

0

0

0

0

0

0

0

1

0

1

0

1

0

100

0

0

0

0

0

0

0

0

0

1

1

0

0

1

0

0

-100

0

0

0

0

0

0

0

0

0

1

1

0

0

1

0

0


Come evidenziato negli esempi, tra il bit di segno e quello più significativo del modulo viene inserita a completamento una serie di zero.

Quindi con una configurazione di n bit possono essere rappresentati tutti i valori interi compresi tra

-2n-1 -1  e  +2n-1 -1

Si osservi che in questo tipo di rappresentazione esiste uno "zero positivo" ed uno "zero negativo".

+0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

-0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0


Questa incongruenza può creare diversi problemi nei processi di elaborazione. E' stato quindi ideato un nuovo metodo di codifica, denominato "complemento a 2", che elimina questa discrepanza.

Esercizi

Eseguire almeno 10 esercizi proposti dal modulo "Modulo e segno" della voce di menù "Codifica dei numeri".  Continuare fino a quando si ottengono sempre risposte corrette.

2.2 - Rappresentazione in complemento a 2

In una sequenza di n bit è possibile creare 2n configurazioni diverse. Nella rappresentazione in complemento, mentre a un valore x positivo viene associata la sua configurazione binaria, al valore -x viene associata la configurazione 2n-x .

Ad esempio, in una configurazione ad 8 bit la rappresentazione del numero +15 è la seguente:

+15

0

0

0

0

1

1

1

1

Ora, se voglio rappresentare il numero -15, dovrò applicare la formula 28-15 che nel sistema binario comporta la seguente operazione:

(28)   1 0 0 0 0 0 0 0 0 -
                       
                       
(15)      0 0 0 0 1 1 1 1 =
   
-
-
-
-
-
-
-
-
-
-
                       
                       
(-15)       1 1 1 0 0 0 1  

 

Quindi il numero binario  11110001 così ottenuto rappresenta il valore -15.

Si osservi però, che il numero 11110001 non è altro che il complemento alla base del numero 00001111  .

Quindi i numeri negativi verranno rappresentati semplicemente con il complemento alla base del loro valore positivo (vedi il paragrafo 1.6).

La rappresentazione in complemento gode delle seguenti proprietà:

Questa rappresentazione è quella più usata in quanto facilita notevolmente le operazioni aritmetiche all'interno della macchina.

Prima di proporre alcuni esempi riportiamo qui di seguito i valori minimi e massimi che possono essere espressi con questo tipo di rappresentazione in funzione del configurazione di bit disponibile:

Configurazione

Valore minimo

Valore massimo

a 8 bit  (1 byte)  [char]

-128

+127

a 16 bit (2 byte) [integer]

-32.768

+32.767

a 32 bit (4 byte) [long]

-2.147.483.648

+2.147.483.647

Esempio

Rappresentare in complemento a 2 dei numeri: +53 e -53:

+53

0

0

0

0

0

0

0

0

0

0

1

1

0

1

0

1

-53

1

1

1

1

1

1

1

1

1

1

0

0

1

0

1

1

Determinare il valore del numero rappresentato con la seguente configurazione di bit in complemento a 2.

0

0

0

0

0

0

0

0

0

0

1

0

0

1

1

0

Poiché il primo bit è 0 il valore è sicuramente positivo ed otterrò:

25 + 22 + 21= 32 + 4 + 2 = 38

Determinare il valore del numero rappresentato con la seguente configurazione di bit in complemento a 2.

1

1

1

1

1

1

1

1

1

0

1

0

0

1

1

0

Poiché il primo bit è 1 il valore è sicuramente negativo. Per calcolare il valore assoluto del numero devo prima calcolare il suo complemento alla base che è:

0

0

0

0

0

0

0

0

0

1

0

1

1

0

1

0

Ottengo quindi:

26 + 24 + 23 + 21 = 64 + 16 + 8 + 2 = -90

Esercizi

Eseguire almeno 10 esercizi proposti dal modulo "Complemento a 2" della voce di menù "Codifica dei numeri".  Continuare fino a quando si ottengono sempre risposte corrette.

3 - La codifica dei numeri reali

Sappiamo che nella maggior parte dei casi per eseguire determinati calcoli non è possibile utilizzare i numeri interi ma occorre invece adoperare numeri reali, numeri cioè, che possono contenere una parte decimale. Abbiamo visto inoltre che i valori che possono essere espressi da una determinata configurazione di bit sono, tutto sommato, abbastanza limitati. Occorre quindi trovare un altro metodo per rappresentare numeri che contengono una parte decimale o che esprimono grandezze molto grandi. Osserviamo ora i seguenti numeri:

100

= +0,1 * 103

 10

= +0,1 * 102

  1

= +0,1 * 101

  0,1

= +0,1 * 100

  0,01

= +0,1 * 10-1

 -10

= -0,1 * 102

  -0,01

= -0,1 * 10-1
P greco  

3,14159265358979

= +0,314159265358979 * 101

Lunghezza di Planck in mm  

0,00000000000000000000000000000000001616

= +0,1616 * 10-34
Distanza in Km tra la Terra e Andromeda (2 milioni di anni luce)

18.921.599.999.936.900.000

= +0,189215999999369 * 1020

Si tratta di numeri che esprimo grandezze molto diverse e che pertanto assumo forme altrettanto diverse; si rende quindi necessario trovare una forma di rappresentazione che sia la più omogenea possibile. Osservando le espressioni esposte nella colonna di sinistra si osserva quanto segue:

Questo modo di rappresentare i numeri reali si dice "notazione esponenziale".

Nella notazione esponenziale possiamo quindi individuare i seguenti elementi:

In teoria è possibile, con questo metodo,  rappresentare numeri di qualsiasi grandezza. In pratica però, se lo spazio disponibile è limitato, dobbiamo fare i conti con una serie di limiti. A titolo di esempio, supponiamo di avere a disposizione complessivamente 12 celle dove in ogni cella è possibile inserire una sola cifra o un solo segno (+,-) e dividiamo lo spazio disponibile tra i vari elementi che compongono il numero nel seguente modo:

I numeri esposti precedentemente possono essere rappresentati nel seguente modo:

Notazione esponenziale

Rappresentazione normalizzata a virgola mobile (floating point)

 +0,1 * 103

+

1

0

0

0

0

0

0

0

+

0

3

 +0,1 * 102

+

1

0

0

0

0

0

0

0

+

0

2

 +0,1 * 101

+

1

0

0

0

0

0

0

0

+

0

1

 +0,1 * 100

+

1

0

0

0

0

0

0

0

+

0

0

 +0,1 * 10-1

+

1

0

0

0

0

0

0

0

-

0

1

 -0,1 * 102

-

1

0

0

0

0

0

0

0

+

0

2

 -0,1 * 10-1

-

1

0

0

0

0

0

0

0

-

0

1

 +0,314159265358979 * 101

+

3

1

4

1

5

9

2

6

+

0

1

 +0,1616 * 10-34

+

1

6

1

6

0

0

0

0

-

3

4

+0,189215999999369 * 1020

+

1

8

9

2

1

5

9

9

+

2

0

E' importante notare che non tutti i numeri sono stati rappresentati nella loro completezza; infatti nella rappresentazione dei numeri (+0,314159265358979 * 101) e (+0,189215999999369 * 1020) siamo stati costretti a tralasciare le ultime 7 cifre significative in quanto non abbiamo, all'interno della mantissa, lo spazio necessario per inserirle. L'ordine di grandezza del numero così espresso è corretto mentre la precisione dello stesso è stata notevolmente limitata.

Osserviamo inoltre che non è possibile rappresentare numeri con un ordine di grandezza superiore a 10+99 e inferiore a 10-99 in quanto non c'è lo spazio sufficiente per rappresentare un esponente di 3 o più cifre. Fortunatamente difficilmente si avrà necessità di utilizzare numeri così grandi e così piccoli.

Possiamo quindi concludere che:

Questo modo di codificare i numeri reali si dice: rappresentazione normalizzata a virgola mobile (floating point). Per semplificare la trattazione abbiamo utilizzato i numeri del sistema decimale. All'interno del calcolatore questa rappresentazione avviene ovviamente con dei numeri binari applicando gli stessi meccanismi.

In pratica, in quasi tutti i linguaggi di programmazione, sono disponibili due tipi di rappresentazione dei numeri reali che si differenziano per il numero di byte utilizzati:

Concludiamo il capitolo relativo alla codifica dei numeri con una tabella riepilogativa che elenca tutte le caratteristiche dei principali tipi di dato numerici utilizzati da quasi tutti i linguaggi di programmazione.

Numeri

Tipo

Bit

Byte

Cifre significative

Valore minimo

Valore massimo

Interi

char

8

1

 

-128

-127

Interi

integer

16

2

 

-32.768

+32.767

Interi

long

32

4

 

-2.147.483.648

-2.147.483.647

Reali

float

32

4

7

±10-38

±10+38

Reali

double

64

8

16

±10-308

±10+308

Esercizi

Eseguire almeno 10 esercizi proposti dal modulo "Numeri a virgola mobile" della voce di menù "Codifica dei numeri".  Continuare fino a quando si ottengono sempre risposte corrette.

3 - La codifica dei caratteri alfanumerici

Per alfabeto esterno di un calcolatore s'intende l'insieme dei caratteri che la macchina è in grado di leggere o scrivere con le sue apparecchiature d'ingresso (per esempio la tastiera) o d'uscita (per esempio la stampante e il video). L'alfabeto esterno è comprensibile all'uomo ed è composto da svariati caratteri quali:

L'alfabeto interno del computer è, come sappiamo, rappresentato soltanto dall'alfabeto binario (0, 1).

Occorre quindi trovare una convenzione per trasformare i caratteri dell'alfabeto esterno in numeri binari. L'operazione che trasforma i caratteri di un alfabeto esterno in numeri binari si dice "codifica". Così, per esempio, se si schiaccia il tasto "a" sulla propria tastiera, all'interno del calcolatore verrà inviato un messaggio contenente una stringa di 8 bit (per esempio 0110 0001) che rappresenta appunto il carattere "a".  Nei moderni calcolatori   viene quindi adottato un codice che associa ad ogni carattere una stringa di 8 bit (1 byte). Poiché le configurazioni possibili di 8 bit sono 256 (28)  è possibile rappresentare soltanto 256 caratteri diversi. Sono stati creati diversi tipi di codici, ma, attualmente, il codice più diffuso è quello denominato ASCII (American Standard Code for Information Interchange).

I caratteri rappresentati dal codice ASCII si possono classificare in tre categorie:

I caratteri di controllo sono codici che hanno un significato particolare e che non possono essere stampati o visualizzati.

I caratteri standard sono quelli visibili e stampabili e che sono universalmente riconosciuti da tutti i computer.

I caratteri del codice esteso sono quelli sviluppati dalle grandi case costruttrici di computer e si possono incontrare differenze passando dall'una all'altra.

CARATTERI DI CONTROLLO

 

DEC

HEX

Car.

Descrizione

DEC

HEX

Car.

Descrizione

0

00

NUL

Null

16

10

DLE

Data link escape

1

01

SOH

Start of heading

17

11

DC1

Device control 1

2

02

STX

Start of text

18

12

DC2

Device control 2

3

03

ETX

End of text

19

13

DC3

Device control 3

4

04

EOT

End of transmission

20

14

DC4

Device control 4

5

05

ENQ

Enquiry

21

15

NAK

Negative acknowledge

6

06

ACK

Acknowledge

22

16

SYN

Synchronous idle

7

07

BEL

Bell, alarm

24

17

ETB

End of transmission block

8

08

BS

Backspace

24

18

CAN

Cancel

9

09

HT

Horizontal tabulation

25

19

EM

End of medium

10

0A

LF

Line feed

26

1A

SUB

Substitute

11

0B

VT

Vertical tabulation

27

1B

ESC

Escape

12

0C

FF

Form feed

20

1C

FS

File separator

13

0D

CR

Carriage return

29

1D

GS

Group separator

14

0E

SO

Shift out

30

1E

RS

Record separator

15

0F

SI

Shift in

31

1F

US

Unit separator

Vale la pena di sottolineare il significato dei caratteri di controllo usati più comunemente:

7

BEL

Emette un beep

8

BS

Spazio nella posizione precedente. Equivale alla cancellazione del carattere precedente

9

HT

Tabulazione orizzontale: il cursore avanza di un numero prefissato di posizioni

10

LF

Avanzamento di una linea

12

FF

Salto pagina

13

CR

Ritorno a capo: il cursore si posiziona all'inizio della riga

27

ESC

Consente di estendere il significato dei caratteri che hanno un significato particolare. Avverte che il carattere che segue dovrà essere  letto insieme a ESC (sequenza d'escape) e dovrà essere interpretato diversamente dal solito.

CARATTERI STANDARD

DEC.

HEX.

CAR.

DEC.

HEX.

CAR.

DEC.

HEX.

CAR.

DEC.

HEX.

CAR.

 

32

20

 

56

38

8

80

50

P

104

68

h

 

33

21

!

57

39

9

81

51

Q

105

69

i

 

34

22

"

58

3A

:

82

52

R

106

6A

j

 

35

23

#

59

3B

;

83

53

S

107

6B

k

 

36

24

$

60

3C

<

84

54

T

108

6C

l

 

36

25

%

61

3D

=

85

55

U

109

6D

m

 

38

26

&

62

3E

>

86

56

V

110

6E

n

 

39

27

'

63

3F

?

87

57

W

111

6F

o

 

40

28

(

64

40

@

88

58

X

112

70

p

 

41

29

)

65

41

A

89

59

Y

113

71

q

 

42

2A

*

66

42

B

90

5A

Z

114

72

r

 

43

2B

+

67

43

C

91

5B

[

115

73

s

 

44

2C

,

68

44

D

92

5C

\

116

74

t

 

45

2D

-

69

45

E

93

5D

]

117

75

u

 

46

2E

.

70

46

F

94

5E

^

118

76

v

 

47

2F

/

71

47

G

95

5F

_

119

77

w

 

48

30

0

72

48

H

96

60

`

120

78

x

 

49

31

1

73

49

I

97

61

a

121

79

y

 

50

32

2

74

4A

J

98

62

b

122

7A

z

 

51

33

3

75

4B

K

99

63

c

123

7B

{

 

52

34

4

76

4C

L

100

64

d

124

7C

|

 

53

35

5

77

4D

M

101

65

e

125

7D

}

 

54

36

6

78

4E

N

102

66

f

126

7E

~

 

55

37

7

79

4F

O

103

67

g

127

7F

 

Per vedere i caratteri del codice esteso presenti sul tuo computer esegui la voce  "Codici ASCII" della voce di menù "Codici" del programma utilizzato per le esercitazioni.

E' importante notare è possibile effettuare operazioni di confronto tra caratteri e che il risultato dipende la valore del codice assegnato ad ogni carattere. Così ad esempio:

·        "b" (98) è maggiore di "a" (97),

·        "A"  (65) è minore di  "a" (97),

·        "9"  (57) è minore di  "A" (65),

·        "$" (36) è maggiore di "!" (33),

·        " "  (32) (spazio) è minore di  "A" (65),

Abbiamo visto che con un byte e possibile codificare 256 caratteri diversi che, a prima vista, sembrano più che sufficienti per rappresentare tutti i caratteri che utilizziamo nella scrittura dei nostri testi. Tuttavia la diffusione del computer in tutte le aree geografiche del mondo ha fatto nascere l'esigenza di rappresentare i caratteri di tutti gli alfabeti (cinese, arabo, giapponese, indiano, ecc.). E' evidente che  i caratteri dei vari alfabeti è molto elevato (diverse migliaia) e che non è più possibile rappresentarli all'interno di un solo byte.   Per soddisfare questa esigenza è stato ideato il codice UNICODE che utilizza due byte (16 bit) per rappresentare un solo carattere. In tal modo è possibile codificare 216 = 65.536 caratteri diversi, un numero più che sufficiente per rappresentare tutti i caratteri delle principali lingue del mondo.


materiale tratto dal sito http://www.itcmelloni.it