Decimali, Binari & C
BCD
comune, mezzo byte...
|
BCD comune, mezzo byte ...
Come abbiamo detto, Si usa definire "nibble"
la metà di un byte, ovvero i primi o gli
ultimi quattro bit.
Così i bit da 7 a 4 costituiscono il nibble alto (high nibble) e i bit da 3 a 0
il nibble basso (low nibble) :
BINARIO |
ESADECIMALE |
High nibble |
Low nibble |
High nibble |
Low nibble |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit1 |
bit 0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
A |
5 |
Che senso ha questa ulteriore definizione ?
Ha importanza perchè un byte si
presta ad un' altra forma di codifica dei numeri : il BCD.
BCD termine si indica una codifica dei numeri
decimali usando le cifre ad 0 a 9 .
BCD è acronimo Binary Coded Decimal, ovvero codifica binaria di
numeri decimali.
Cerchiamo di capire la cosa
attraverso qualche esempio.
Se limito nell' esadecimale le cifre a 9 più lo zero, posso far stare in un
byte numeri da 00 a 99 :
e mi stabilisco allora una convenzione che dice : " il numero che la cifra rappresenta è proprio il numero
decimale", ovvero 01 è 1, 22 è 22 e 99 è 99, anche se utilizzo un byte per
supportarli.
Non è più "esadecimale", ma una nuova codifica, il BCD.
Chiariamo che BCD non è un
sistema di numerazione come quelli fino ad ora visti, bensì una convenzione per
rappresentare i numeri decimali in un mezzo (il computer) che
funziona con il sistema binario.
77 in BCD non può essere definito come 77baseBCD
perchè non è un sistema di numerazione.
Per distinguere 77base16 da 77base8,
77base10 e 77 in BCD dovrò usare altri sistemi
che vedremo più avanti.
Per ora, facciamo una tabella :
|
HEX |
BINARIO |
DECIMALE |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
minimo |
00 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
massimo |
99 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
99 |
Se osservo i nibble, vedo chiaramente che ogni nibble contiene una cifra
decimale. Questo "pacchetto" di due cifre decimali stipate in un byte
si chiama BCD compresso.
Ovviamente 9A o BB NON sono numeri BCD validi in quanto BCD ammette solo le
cifre da 0 a 9.
Se dovessi scrivere il decimale 765 lo farei usando 12 bit, ovvero 12 cifre
binarie, che sono poi tre cifre esadecimali :
765 decimale |
BINARIO |
bit 11 |
bit 10 |
bit 9 |
bit 8 |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
HEX |
7 |
6 |
5 |
Se osserviamo, le cifre del numero decimale sono le stesse di quello
esadecimale (dato che in BCD non possiamo usare altro che le cifre da 0 a 9)
corrispondente, per cui, se non chiarisco la codifica usata, 765 può
essere tanto 765base16 quanto 765bcd
che è poi 765base10.
Questo aspetto del problema sarà chiarito più avanti. Per ora possiamo considerare che questo è un vantaggio, in quanto il numero è lo stesso e non devo fare
operazioni di conversione.
Ancora, per chiarire meglio la differenza, con tre cifre esadecimali il
massimo esprimibile è FFF.
BINARIO |
bit 11 |
bit 10 |
bit 9 |
bit 8 |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
HEX |
F |
F |
F |
che equivale a 4095 decimale.
Con tre cifre BCD il massimo esprimibile è 999 (... non posso usare cifre oltre
il 9, anche se con 4 bit binari potrei arrivare a F):
BINARIO |
bit 11 |
bit 10 |
bit 9 |
bit 8 |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
BCD |
9 |
9 |
9 |
Vediamone un' altro esempio , 1024 decimale :
1024
decimale
|
BINARIO |
bit 15 |
bit 14 |
bit 13 |
bit 12 |
bit 11 |
bit 10 |
bit 9 |
bit 8 |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
HEX |
1 |
0 |
2 |
4 |
Con questo BCD e con l' aggiunta di istruzioni specifiche nel set del processore
(SWAP, DAW, ecc) si può di contare direttamente in "BCD", ovvero in
decimale, evitando l' operazione di conversione da esadecimale a decimale, in
quanto i numeri nei bytes sono decimali..
Inoltre il BCD è l' anticamera dell' ASCII, il codice universalmente adottato
per lai rappresentazione dei caratteri nei computer.
|