fabio ghidini — ghidini@ddattica.net
Nel seguente documento verranno utilizzati i seguenti simboli:
Inoltre in questo documento per brevità non verranno utilizzati numeri decimali (numeri con frazioni di unità, intese in qualsiasi sistema numerico) né numeri negativi, e di conseguenza non verranno illustrati gli argomenti e i problemi relativi a questi numeri (tali argomenti potrebbero essere oggetto di ulteriori documenti).
Si noti che per i numeri decimali verrà utilizzata la notazione italiana che prevede l'inserimento di un punto ( . ) tra le migliaia, ad esempio 1.347.908dec.
Per comodità di lettura i numeri binari verranno suddivisi, con degli spazi, in blocchi di 4 cifre, ad esempio 1101 0010 0011bin.
Verranno utilizzate la b minuscola per indicare il bit (o i bits) e la B maiuscola per indicare il byte (o i bytes).
Cominciamo col vedere alcune proprietà delle potenze. 32 significa moltiplicare 3 per 3 due volte, cioé
32 = 3 × 3mentre scrivere 53 significa moltiplicare 5 per 5 tre volte, cioé
53 = 5 × 5 × 5Scrivere un numero ad esponente negativo significa farne l'inverso, cioé:
8-2 = 1 ÷ 82 = 1 / 82Esistono alcune proprietà che caratterizzano le potenze ai fini del nostro argomento:
In particolare, si noti che elevare ad esponente il numero dieci facilita il calcolo: 10x, cioé elevare 10 ad un esponente x significa fare seguire all' 1 tanti zeri quanto é il valore di x
Il nostro sistema di numerazione, che deriva dagli Arabi, é un sistema con notazione posizionale in base 10. Ciò significa che:
Ad esempio, possiamo esprimere il numero 25749 scomponendolo nelle sue componenti esponenziali in base 10:
25.049 = 2×104 + 5×103 + 0×102 + 4×101 + 9×100dove appunto 10 é la base.
Ma da dove deriva l'idea di utilizzare la base 10? Probabilmente dal fatto che
gli esseri umani hanno 10 dita. Il sistema di numerazione in base 10, quindi,
é particolarmente 'naturale' per gli uomini.
Quale numero massimo é possibile rappresentare, ad esempio, con 8 cifre decimali? La risposta é ovvia, proprio per il fatto che siamo abituati a ragionare in base 10: il numero massimo rappresentabile con 8 cifre é:
99.999.999 cioé 9×107 + 9×106 + 9×105 + 9×104 + 9×103 + 9×102 + 9×101 + 9×100Il range (l'intervallo) di valori rappresentabile con 8 cifre va da 0 a 99.999.999, o più semplicemente da 0 a 108-1. Infatti 108-1 = 100.000.000 - 1 = 99.999.999E si noti che questi numeri sono
(99.999.999 numeri)+ (1 numero, lo zero) = 100.000.000 numeri = 108 numeriPiù in generale, con x cifre decimali si possono rappresentare 10x numeri, e tali numeri vanno da 0 a 10x-1.
Quindi, ad esempio, con 5 cifre decimali si possono rappresentare 105 numeri che vanno da 0 a 105-1, cioé da 0 a 99.999.
I computer funzionano con componenti elettronici, all'interno dei quali circola la corrente. E' più semplice per un computer identificare 2 differenti livelli di tensione, che non 10: quando in un componente elettronico c'é tensione, si considera che il numero rappresentato sia 1, quando non c'é tensione si ha il numero 0. Da qui il fatto che i computer funzionano con il sistema binario.
Ecco le caratteristiche del sistema binario:
Si noti che, a meno della base e delle cifre, tutto funziona esattamente come per il sistema decimale!
Proviamo ora a scrivere un numero binario: ovviamente possiamo solo utilizzare le cifre 0 e 1. Ad esempio possiamo scrivere:
1001 1101binAnalogamente a quanto visto per il sistema decimale, scomponiamo il numero binario (dalla cifra più significativa a sinistra, verso destra) nelle sue componenti esponenziali (in base 2), cioé:
1001 1101bin = (1×27 + 0×26 + 0×25 + 1×24 + 1×23 + 1×22 + 0×21 + 1×20)decDopo aver scomposto questo numero binario é anche facile calcolare a quale numero decimale corrisponde , basta fare il calcolo:
1001 1101bin = (1×27 + 0×26 + 0×25 + 1×24 + 1×23 + 1×22 + 0×21 + 1×20)dec = = (1×128 + 0×64 + 0×32 + 1×16 + 1×8 + 1×4 + 0×2 + 1×1)dec = 157dec| 1001 1101bin = | 1×27 | + 0×26 | + 0×25 | + 1×24 | + 1×23 | + 1×22 | + 0×21 | + 1×20 |
| = | 1×128 | + 0×64 | + 0×32 | + 1×16 | + 1×8 | + 1×4 | + 0×2 | + 1×1 |
| = | 128 | + 0 | + 0 | + 16 | + 8 | + 4 | + 0 | + 1 |
| = 157 |
La conversione da un numero dicimale in un numero binario può essere effettuata semplicemente utilizzando l'algoritmo della divisione ripetuta per 2 . E' sufficiente dividere ripetutamente il numero decimale da convertire per 2. Il resto della divisione diventa la cifra meno significativa del numero binario e andrà messa a destra (e le successive andranno inserite via via a sinistra di quelle già scritte). Quindi si ripete il procedimento della divisione per 2 applicandolo al quoziente del passo precedente. La procedura continua fino a quando il quoziente diventa 0.
Supponiamo ad esempio di volere convertire 275dec in binario:
| Divisione | Quoziente | Resto | |
|---|---|---|---|
| 275 / 2 | 137 | 1 | 1 |
| 137 / 2 | 68 | 1 | 11 |
| 68 / 2 | 34 | 0 | 011 |
| 34 / 2 | 17 | 0 | 0011 |
| 17 / 2 | 8 | 1 | 10011 |
| 8 / 2 | 4 | 0 | 010011 |
| 4 / 2 | 2 | 0 | 0010011 |
| 2 / 2 | 1 | 0 | 00010011 |
| 1 / 2 | 0 | 1 | 100010011 |
Abbiamo ottenuto che 275dec = 1 0001 0011bin.
Si noti che questo algoritmo é solo uno di quelli possibili per la conversione decimale-binario.
Analogamente al sistema decimale, é possibile calcolare qual é il range di valori che é possibile rappresentare che x cifre binarie: esso andrà da 0dec a (2x-1)dec, cioé 2x numeri.
Ad esempio, con 8 cifre binarie é possibile rappresentare 28 = 256 numeri, che andranno da da 0dec a (28-1=255)dec, o meglio da 0000 0000bin a 1111 1111bin. Infatti:
1111 1111bin = (1×27 + 1×26 + 1×25 + 1×24 + 1×23 + 1×22+ 1×21+ 1×20)dec = 255decIl sistema binario, per quanto perfetto per l'uso nei calcolatori, é poco pratico da utilizzare, in quanto per esprimere un numero decimale (ad esempio 487dec) neppure troppo grande sono necessarie parecchie cifre decimali (nell'esempio 1 1110 0111bin). Per questo motivo é stato introdotto l'utilizzo del sistema esadecimale, che presenta alcuni vantaggi:
Come alcuni potranno evincere dal nome, il sistema esadecimale prevede base 16. Poiché nel nostro sistema decimale si hanno solo 10 cifre (0..9), si ovvia al problema inserendo tra le cifre anche alcune lettere, fino ad arrivare a 16 cifre:
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,FIn questo modo abbiamo ottenuto le 16 cifre che servivano. Come é facile capire, si ha che
Ecco le caratteristiche del sistema esadecimale:
Proviamo a scrivere un numero esadecimale, ad esempio C38Fhex. Come al solito possiamo fattorizzarlo nelle sue componenti potenze della base, e da qui ottenere il suo valore decimale:
C38Fhex = (C×163 + 3×162 + 8×161 + F×160)˜dec = (12×163 + 3×162 + 8×161 + 15×160)dec = 50.063decLa conversione da un numero decimale al rispettivo esadecimale si può effettuare con l'algoritmo della divisione ripetuta per 16, analogo al metodo della divisione ripetuta per 2 già visto in precedenza.
Probabilmente più interessante risulta essere la conversione tra un numero binario in esadecimale (e viceversa), proprio in virtù del fatto che il sistema esadecimale é stato inventato ed introdotto proprio per scrivere i numeri in modo più compatto con una conversione semplice.
Ecco la tabella di conversione, facilmente ottenibile dalle proprietà già viste:
| Sistema decimale | Sistema binario | Sistema esadecimale |
|---|---|---|
| 00 | 0000 | 0 |
| 01 | 0001 | 1 |
| 02 | 0010 | 2 |
| 03 | 0011 | 3 |
| 04 | 0100 | 4 |
| 05 | 0101 | 5 |
| 06 | 0110 | 6 |
| 07 | 0111 | 7 |
| 08 | 1000 | 8 |
| 09 | 1001 | 9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
Dalla tabella si può notare che ogni cifra esadecimale può essere rappresentata da un numero binario di 4 cifre.
Supponiamo di voler convertire in esadecimale il numero 1 1000 1110 0001bin. Il primo passo consiste nell'aggiungere degli zeri alla sinistra del numero in modo da avere un numero totale di cifre multiplo di 4, cioé 0001 1000 1110 1011bin.
A questo punto é sufficiente convertire singolarmente ciascun blocco, mantenendo l'ordine:
Cioé 1 1000 1110 1011bin = 18EBhex.
Analogamente é possibile effettuare la conversione da esadecimale a binario, é sufficiente trasformare ogni cifra esadecimale in un numero binario di 4 cifre. Questo proprio in virtù del fatto che ad ogni cifra xhex corrisponde un numero binario di 4 cifre, in quanto la più grande cifra esadecimale é Fhex = 15dec = 1111bin .
Qual é il range di valori che é possibile rappresentare con x cifre esadecimali? Esso andrà da 0dec a (16x-1)dec, cioé si tratta di 16x numeri.
Ad esempio, con 4 cifre esadecimali é possibile rappresentare 164 = 65.536 numeri, che andranno da 0dec a (164-1=65.535)dec, o meglio da 0000hex a FFFFhex. Infatti:
FFFFhex = (F×163 + F×162 + F×161 + F×160)˜dec = (15×163 + 15×162 + 15×161 + 15×160)dec = 65.535dec| Sistema | Base | Cifre | # cifre | Esempio di scomposizione in fattori | # rappresentabili con x cifre (ad es. con 4 cifre) |
range con x cifre (ad es. con 4 cifre) |
|---|---|---|---|---|---|---|
| Decimale | 10 | 0,1,2,3,4,5,6,7,8,9 (in totale 10 cifre) | 10 | 4076 = 4×103 + 0×102 + 7×101 + 6×100 | 10x (104= 10.000) |
da 0 a 10x-1 (da 0 a 9.999) |
| Binario | 2 | 0,1 (in totale 2 cifre) | 2 | 0101 = 0×23 + 1×22 + 0×21 + 1×20 | 2x (24= 16) |
da 0 a 2x-1 (da 0 a 1111bin=15dec) |
| Esadecimale | 16 | 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F (in totale 16 cifre) | 16 | E20C = E×163 + 2×162 + 0×161 + C×160 = 14×163 + 2×162 + 0×161 + 12×160 | 16x (164= 65.536) |
da 0 a 16x-1 (da 0 a FFFFhex=65.536dec) |