Salta ai contenuti

Rappresentazione dell'Informazione

Nelle pagine sulle conversioni numeriche abbiamo imparato a rappresentare i numeri in binario. Ma un computer non deve memorizzare solo numeri: deve gestire testi, immagini, suoni, video, e molto altro ancora.

Come fa a farlo? La risposta è sorprendentemente semplice: tutto viene trasformato in numeri, e quei numeri vengono poi scritti in binario.

Testo, immagini, suoni, video...
┌──────────────────────┐
│ CODIFICA (regola) │ ←── "La lettera A vale il numero 65"
└──────────────────────┘
Numeri interi
┌──────────────────────┐
│ Conversione binaria │
└──────────────────────┘
01000001 01000010 ... ←── quello che c'è davvero nella memoria

La codifica è semplicemente un accordo: una tabella che associa ogni simbolo (lettera, numero, colore, suono…) a un numero intero. Dato quel numero, il computer lo converte in binario e lo memorizza. Quando serve rileggerlo, fa il percorso inverso.

In questo capitolo vediamo come funzionano alcune codifiche reali e come si potrebbe inventarne una da zero.


1. Il Codice ASCII: il primo alfabeto del computer

Cos’è ASCII?

Nei primi anni della storia dei computer (anni ‘60), americani e europei si sono messi d’accordo su una tabella standard: il codice ASCII (American Standard Code for Information Interchange).

L’idea è semplicissima: assegnare a ogni carattere utile (lettere, cifre, punteggiatura, spazio…) un numero intero da 0 a 127. Bastano 7 bit per rappresentare tutti e 128 i codici (27=1282^7 = 128). Nella pratica si usa sempre 1 byte (8 bit), usando il bit più significativo come 00.

Ecco una parte della tabella ASCII con i caratteri più usati:

DecimaleBinarioCarattereDecimaleBinarioCarattere
3200100000(spazio)6401000000@
480011000006501000001A
490011000116601000010B
500011001026701000011C
510011001136801000100D
520011010046901000101E
530011010157001000110F
540011011067101000111G
550011011177201001000H
560011100087301001001I
570011100197401001010J
9701100001a7501001011K
9801100010b7601001100L
9901100011c7701001101M
10001100100d7801001110N
10101100101e7901001111O
10201100110f8001010000P
10301100111g8101010001Q
10401101000h8201010010R
10501101001i8301010011S
10601101010j8401010100T
10701101011k8501010101U
10801101100l8601010110V
10901101101m8701010111W
11001101110n8801011000X
11101101111o8901011001Y
11201110000p9001011010Z
11301110001q3300100001!
11401110010r4400101100,
11501110011s4600101110.
11601110100t6300111111?

Come si codifica una parola?

Ogni lettera diventa il suo codice ASCII, che viene poi scritto come 1 byte in binario. Una stringa di testo è quindi una sequenza di byte, uno per ogni carattere.

Quanta memoria occupa un testo?

Con ASCII ogni carattere occupa esattamente 1 byte. Quindi:

dimensione testo=numero di caratteri×1 byte\text{dimensione testo} = \text{numero di caratteri} \times 1 \text{ byte}

Un romanzo di 500 pagine con circa 2000 caratteri per pagina occupa:

500×2000×1 byte=1.000.000 byte1 MB500 \times 2000 \times 1 \text{ byte} = 1.000.000 \text{ byte} \approx 1 \text{ MB}


2. I limiti di 8 bit: Unicode e il mondo oltre l’inglese

Con 8 bit (1 byte) si hanno al massimo 28=2562^8 = 256 codici diversi. L’ASCII standard ne usa solo 128 (codici 0–127). I codici da 128 a 255 sono stati usati in modi diversi da paesi diversi — e qui sono iniziati i problemi.

Lettere italiane come à, è, ì, ò, ù non ci sono nella tabella ASCII standard! Stessa cosa per lettere tedesche (ä, ö, ü), francesi (ç, ê), greche (α, β, γ), cinesi, arabe, giapponesi… e le emoji! 😄

La soluzione: Unicode

Unicode è uno standard internazionale nato negli anni ‘90 che assegna un numero univoco a ogni simbolo usato da ogni lingua del mondo, passato e presente. Ad oggi contiene oltre 140.000 caratteri.

CarattereNome UnicodeCodice
ALATIN CAPITAL LETTER AU+0041
éLATIN SMALL LETTER E WITH ACUTEU+00E9
αGREEK SMALL LETTER ALPHAU+03B1
CJK UNIFIED IDEOGRAPH-4E2DU+4E2D
😄SMILING FACE WITH OPEN MOUTH AND SMILING EYESU+1F604

Ovviamente con soli 8 bit non è possibile rappresentare 140.000 caratteri diversi (28=256140.0002^8 = 256 \ll 140.000). Servono più bit.

UTF-8: la codifica di Unicode più usata su Internet

UTF-8 è la codifica più diffusa di Unicode. Usa un numero variabile di byte per carattere:

  • I caratteri ASCII originali (0–127) vengono codificati con 1 solo byte (compatibilità totale)
  • I caratteri europei comuni usano 2 byte
  • I caratteri asiatici e di altre scritture usano 3 byte
  • Emoji e caratteri rari usano 4 byte

3. Inventare una propria codifica: il mazzo di carte

Il concetto di codifica non è magico: chiunque può inventarne una. L’importante è che sia non ambigua (ogni sequenza di bit corrisponda a un solo simbolo) e completa (ogni simbolo abbia un codice).

Proviamo a inventare una codifica per un mazzo di carte da gioco standard (52 carte).

Approccio 1: numerazione semplice

Il metodo più diretto: numeriamo le carte da 0 a 51 e rappresentiamo ogni numero in binario.

Quanti bit ci servono? Dobbiamo rappresentare 52 valori distinti (da 0 a 51). Cerchiamo la potenza di 2 più piccola che sia maggiore o uguale a 52:

25=32<5264=262^5 = 32 < 52 \leq 64 = 2^6

Servono quindi 6 bit, che ci permettono di rappresentare fino a 26=642^6 = 64 valori (sprechiamo i codici 52–63, ma non è un problema).

Decidiamo l’ordine delle carte (un esempio):

NumeroCartaBinario (6 bit)
0Asso di ♠000000
12 di ♠000001
23 di ♠000010
12Re di ♠001100
13Asso di ♥001101
51Re di ♣110011

Questo funziona, ma ha uno svantaggio: per sapere che carta è, devo consultare la tabella. Non posso capirlo “a occhio” dal codice binario.

Approccio 2: codifica strutturata (seme + valore)

Un mazzo di carte ha una struttura naturale: 4 semi × 13 valori. Possiamo sfruttarla!

Codificare il seme (4 semi → 2 bit):

SemeCodice
♠ (Picche)00
♥ (Cuori)01
♦ (Quadri)10
♣ (Fiori)11

Due bit bastano: 22=442^2 = 4 \geq 4

Codificare il valore (13 valori → 4 bit):

ValoreCodiceValoreCodice
Asso000181000
2001091001
30011101010
40100Fante1011
50101Donna1100
60110Re1101
70111

Quattro bit ci danno 24=162^4 = 16 valori possibili. Ne usiamo 13, sprechiamo i codici 0000 e 1110–1111.

Codice finale di una carta = 2 bit seme + 4 bit valore = 6 bit totali


4. Quanti bit servono? La formula generale

Abbiamo visto il ragionamento più volte: per rappresentare NN oggetti distinti (carte, lettere, colori, pianeti…) serve trovare il numero minimo di bit kk tale che 2kN2^k \geq N.

In matematica si scrive:

k=log2Nk = \lceil \log_2 N \rceil

dove \lceil \cdot \rceil indica il tetto (arrotondamento all’intero superiore).

In pratica, basta usare questa tabella mentale:

Numero di bitValori rappresentabiliEsempi di utilizzo
1 bit21=22^1 = 2Vero/Falso, Acceso/Spento
2 bit22=42^2 = 4Semi di un mazzo di carte
3 bit23=82^3 = 8Giorni della settimana (ne usiamo 7)
4 bit24=162^4 = 16Valori di una carta (ne usiamo 13)
5 bit25=322^5 = 32Giorni di un mese (ne usiamo 28–31)
6 bit26=642^6 = 64Carte di un mazzo (ne usiamo 52)
7 bit27=1282^7 = 128Caratteri ASCII standard
8 bit28=2562^8 = 256Un byte — colori in scala di grigi
10 bit210=10242^{10} = 1024La “kilo” informatica (1 KiB = 1024 B)
16 bit216=65.5362^{16} = 65.536Caratteri Unicode di base
24 bit224=16.777.2162^{24} = 16.777.216Colori RGB (True Color)

Esempi applicativi


5. Mettiti alla Prova: Esercizi ed Esercitazioni Pratiche

Per consolidare tutti i concetti appresi:

👉 Vai alla raccolta completa degli Esercizi sulla Rappresentazione dell’Informazione

Troverai esercizi su:

  • Codifica e decodifica ASCII (testo ↔ binario)
  • Calcolo del numero di bit necessari
  • Codifica e decodifica di sistemi inventati (carte da gioco e altro)