Conversioni di sistemi numerici
Quando scriviamo programmi per microcontrollori di solito siamo bloccati a trattare con 3 diversi sistemi numerici: decimale, binario ed esadecimale (o hex). Usiamo il decimale perché ci viene naturale; è il modo in cui contiamo. Sfortunatamente, non è il modo in cui contano i computer. Poiché i computer e i microcontrollori sono limitati agli 1 e agli 0, contano usando sequenze di questi numeri. Questo è il sistema di numeri binari. I numeri binari sono di solito preceduti dai caratteri ‘0b’ che non fanno parte del numero. A volte sono anche suddivisi in gruppi di 4 cifre per renderli più facili da leggere e da mettere in relazione con il sistema numerico esadecimale. Un esempio di numero binario è 0b0100.1011. I punti nel numero non rappresentano nulla, rendono solo più facile leggere il numero.
Il sistema binario è semplice da capire, ma ci vogliono molte cifre per usare il sistema binario per rappresentare grandi numeri. Il sistema esadecimale può rappresentare numeri molto più grandi usando meno caratteri, e assomiglia molto ai numeri binari. I numeri esadecimali sono di solito preceduti dai caratteri ‘0x’ che non fanno parte del numero. Una singola cifra esadecimale può rappresentare quattro cifre binarie!
I numeri binari possono consistere solo di 1 e 0; tipicamente un numero binario consiste di 8 cifre (o qualche multiplo di 8) se viene usato in qualche tipo di computer (o microcontrollore). È utile sapere come convertire un numero binario in un numero decimale e viceversa. Quindi come facciamo a convertire tra i sistemi numerici? Prima considera come determiniamo il valore di un numero decimale. Il numero 268 può essere scomposto come 200 + 60 + 8, o 2 * (10^2) + 6 * (10^1) + 8 * (10^0). Ci sono due numeri importanti che dobbiamo conoscere per “decostruire” il numero – la base del sistema numerico e la posizione della cifra all’interno del numero. La base di un numero decimale è 10. Quando convertiamo il numero 268, 2 è la seconda cifra, 6 è la prima cifra e 8 è la cifra zero. Ogni cifra deve essere scalata secondo il suo posto all’interno del numero. La scala della cifra è la base del sistema numerico elevato alla potenza della posizione della cifra nel numero. Quindi ogni numero viene scalato, e poi tutte le cifre scalate vengono aggiunte per trovare il valore totale del numero.
Lo stesso metodo può essere usato per trovare il valore di un numero binario. Per esempio, guardiamo il numero 0b1011.0101. La base del sistema binario è 2 (il prefisso 0b è spesso usato nel codice per indicare che il numero è in formato binario). Il valore del nostro numero è: 1*(2^7)+0*(2^6)+1*(2^5)+1*(2^4)+0*(2^3)+1*(2^2)+0*(2^1)+1*(2^0), che è uguale a 181.
0b1011.0101. Che modo completamente inefficiente di scrivere un numero! Ma possiamo rappresentare lo stesso numero binario usando solo 2 cifre esadecimali. Prima però, inizieremo convertendo un numero esadecimale (hex) in decimale come abbiamo fatto per un numero binario. Che ne dite di 0xB5? Aspetta, cosa? Il prefisso 0x è usato nel codice per indicare che il numero è scritto in esadecimale. Ma cosa ci fa la ‘B’ lì dentro? Il formato esadecimale ha una base di 16, il che significa che ogni cifra può rappresentare fino a 16 valori diversi. Sfortunatamente, finiamo le cifre numeriche dopo il ‘9’, quindi cominciamo a usare le lettere. La lettera ‘A’ rappresenta 10, ‘B’ è 11, ‘C’ è 12, ‘D’ è 13, ‘E’ è 14 e ‘F’ è 15. La ‘F’ è la cifra più grande nel sistema di numerazione esadecimale. Convertiamo il numero allo stesso modo di prima. Il valore di 0xB5, quindi, è: B*(16^1)+5*(16^0) o 181.
Sapere come convertire binario ed esadecimale in decimale è importante, ma la conversione di numeri più utile è probabilmente quella tra esadecimale e binario. Questi due sistemi di numerazione in realtà funzionano abbastanza bene insieme. I sistemi di numerazione sono correlati in modo tale che una singola cifra hex rappresenta esattamente 4 cifre binarie, e così 2 cifre hex possono rappresentare 8 bit (o cifre binarie). Ecco una tabella che mostra come ogni cifra hex è correlata al sistema binario:
Valore binario | Valore hex |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
11 | F |
Ad esempio, per convertire il numero esadecimale 0x1C in binario, dovremmo trovare il corrispondente valore binario per 1 e C e combinarli. Così, 0x1C in binario è 0b0001.1100. Se volessimo capire il valore esadecimale di un numero binario, faremmo il contrario. Per trovare la rappresentazione esadecimale del numero binario 0b0010.1011 troviamo prima il valore esadecimale per 0010, poi il valore esadecimale per 1011 e li combiniamo; il valore esadecimale sarebbe 0x2B.
Ci sono molti strumenti gratuiti disponibili per aiutare a convertire tra questi sistemi di numerazione, basta cercare su Google ‘hex number conversion’. Se usate Windows come sistema operativo, avete un grande strumento incorporato nella calcolatrice. Basta cambiare la calcolatrice in modalità scientifica e si può convertire tra i sistemi numerici digitando un numero e poi cambiando il formato della calcolatrice!