Conversioni
Il computer fin dalle origini comprende un ristretto vocabolario di simboli, cosi ristretto che sono solo due, 0 e 1, anche detti true e false, vero o falso 0V +5V, on off, comunque due restano.
Noi invece siamo abituati ad avere un vocabolario di simboli estremamente più ampio, nel nostro alfabeto possiamo contare ben 22 lettere e con esse possiamo sbizzarrirci con le parole più strane.
Invece per i numeri possiamo lavorare direttamente con 10 simboli questa però non è l’unica possibile rappresentazione dei numeri. E’ solo una delle tante possibili rappresentazioni dei numeri detta appunto rappresentazione in base 10. Ne esistono altre come la rappresentazione in base 8 o 16 o ancora 2. Il computer rappresenta i numeri in base 2, sfruttando cosi il suo povero vocabolario di due simboli.
Conversioni numeriche – base 10 a base n
Queste rappresentazioni sono equivalenti tra loro, quindi un numero rappresentato in base 10 è possibile rappresentarlo in base 2 eseguendo un semplice algoritmo. Nel flowchart seguente possiamo vedere descritto l’algoritmo di conversione di un numero x in base 10 ad una base n arbitraria:

L’algoritmo ha bisogno per partire della base di destinazione “n” e del numero da convertire “x”, inoltre si parte dalla posizione 0 quindi “p” parte con valore 0.
Un esempio, convertire il numero 330 in base 10 alla base 2:
- 330 : 2 = 165 resto 0
- 165 : 2 = 82 resto 1
- 82 : 2 = 41 resto 0
- 41 : 2 = 20 resto 1
- 20 : 2 = 10 resto 0
- 10 : 2 = 5 resto 0
- 5 : 2 = 2 resto 1
- 2 : 2 = 1 resto 0
- 1 : 2 = 0 resto 1
quindi il numero è letto dal fondo 1_0100_10102
Un appunto sulla rappresentazione dei numeri binari:I numeri binari spesso hanno una lunghezza notevole e la loro leggibilità ne risente di questo fatto, nel testo di Hyde e cosi anche nel linguaggio HLA (High level Assembly) viene usata la notazione di mettere per ogni gruppo di 4 bit un’ underscore cosi da semplificarne la lettura. Nel testo del Peterson invece si preferisce usare uno spazio. Io onestamente trovo più evidente l’underscore dello spazio, quindi userò molto spesso questa notazione. Inoltre è buona norma mettere la base come pedice del numero.
Come si vede non è un processo difficile, come anche l’algoritmo di conversione da una base n alla base 10 è formulabile nel seguente modo:

Nel precedente flowchart si può leggere l’algoritmo per convertire un numero da base n alla base 10. Fondamentalmente consiste nel prendere ogni cifra del numero nella base n e moltiplicare questa cifra per la base elevata la posizione della cifra. Il tutto per ogni cifra dopo di che tutti questi risultati vanno sommati tra di loro ed il risultato è il nostro numero in base 10.
Un esempio di conversione del numero 101_01002
- Prendo il numero 0 nella posizione zero contando da destra
- 0 * 2^0 = 0
- Prendo il numero 0 nella posizione uno contando da destra
- 0 * 2^1 = 0
- Prendo il numero 1 nella posizione due contando da destra
- 1 * 2^2 = 4
- Prendo il numero 0 nella posizione tre contando da destra
- 0 * 2^3 = 0
- Prendo il numero 1 nella posizione quattro contando da destra
- 1 * 2^4 = 16
- Prendo il numero 0 nella posizione cinque contando da destra
- 0 * 2^5 = 0
- Prendo il numero 1 nella posizione sei contando da destra
- 1 * 2^6 = 64
-
Sommo il tutto 4 + 16 + 64 = 8410
Molto spesso si trova il medesimo calcolo nella forma seguente:
1*26+0*2^5+1*2^4+0*2^3+1*2^2+0*2^1+0*2^0=4+16+64=84
Conversioni numeriche – base 16
Per la conversione con la base 16 esiste una scorciatoia molto semplici. Consiste nel memorizzare, sapersi ricavare, questa tabella detta anche tabella di lookup:
| Base 2 | Base 16 | Base 2 | Base 16 |
| 0000 | 0 | 1000 | 8 |
| 0001 | 1 | 1001 | 9 |
| 0010 | 2 | 1010 | A |
| 0011 | 3 | 1011 | B |
| 0100 | 4 | 1100 | C |
| 0101 | 5 | 1101 | D |
| 0110 | 6 | 1110 | E |
| 0111 | 7 | 1111 |
F |
Con questa tabella si può prendere un numero in base 2, scomporlo in blocchetti di 4 bit e sostituire per ogni blocco l’equivalente della base 16.
I numeri negativi
La rappresentazione dei numeri negativi non è stata fatta subito in un unico modo ma esistono tre possibili modi: il bit di segno, a complemento ad uno e a complemento a due.
Queste codifiche hanno degli svantaggi e col tempo è prevalsa la soluzione del complemento a due:
- Il bit di segno ha una doppia rappresentazione dello zero ed è scomoda per le operazioni. Questa tecnica consiste semplicemente nel considerare il primo bit, quello di peso maggiore, come il bit di segno. Se il primo bit è 0 significa che è un numero positivo se è 1 significa che è negativo
- La codifica a complemento a uno consiste nel sostituire tutti i bit da 0 ad 1 e viceversa. Questa codifica è comoda per le operazioni ma ha una doppia rappresentazione dello 0
- La codifica a complemento a due consiste nel sostituire tutti i bit da 0 ad 1 e viceversa dopodiché si somma 1 (ignora un eventuale overflow). Questa codifica è quella adesso maggiormente usata.
In questa tabella si possono vedere
Un esempio, la conversione di 5 in -5:
- 0000_0101 il numero di partenza
- 1111_1010 sostituisco tutti gli 0 con 1 e viceversa
- 1111_1011 sommo 1
Se invece voglio convertire da -5 a 5:
- 1111_1011 il numero in complemento a 2
- 0000_0100 il numero invertito
- 0000_0101 sommo 1
Alcun proprietà utili dei numeri binari
Qui elenco alcune proprietà molto utili dei numeri in binario che possono sempre servire:
- Se il bit nella posizione 0 di un numero binario è 1, il numero è dispari altrimenti è pari.
- Se n bit nella parte meno significativa (LO) contengono solo zeri, allora il numero è divisibile per 2n.
- Se il numeri in binario contiene 1 nella posizione n e in tutte le altre posizioni 0, allora quel numero è uguale a 2n.
- Se il numero binario contiene tutti uni dalla posizione zero fino al bit in posizione n escluso ed i bit seguenti sono a zero, allora il valore è uguale a 2n-1.
- Shiftare tutti i bit in un numero binario verso sinistra di una posizione equivale a moltiplicarlo il valore binario per 2.
- Shiftare tutti i bit in un numero binario verso destra di una posizione equivale a dividere il valore binario per 2, i numeri disperi sono arrotondati verso il basso.
Bibliografia
- Write Great Code: Understanding the Machine, Volume I di Randall Hyde edito da No Starch Press
- Computer Organization and Design 3° edition di Peterson e Hennessy edito da Morgan Kaufmann
Tags: Computer