Indice |
I sistemi di numerazione (seconda parte)
Nell'articolo precedente, LogicBignami (IX), abbiamo presentato i sistemi numerici binario, ottale e esadecimale, e abbiamo visto come da questi sia possibile risalire al corrispondente valore nel sistema numerico decimale.
Adesso proseguiamo qui il discorso, analizzando la conversione opposta, ossia il passaggio dal sistema numerico decimale verso un qualsiasi altro sistema numerico e, in particolare, verso i tre appena nominati.
Metodo delle divisioni successive
Il metodo delle divisioni successive è applicabile per la conversione di un numero decimale intero (o della parte intera di un numero frazionario) verso un qualsiasi altro sistema numerico.
In pratica si tratta di dividere, una prima volta, il numero decimale per la radice, o base, del sistema numerico verso cui vogliamo effettuare la conversione, ricavandone quoto e resto: questo primo resto rappresenta la cifra meno significativa (LSD o LSB per i numeri binari) del numero verso cui stiamo effettuando la conversione.
Successivamente si dividerà, ripetutamente, il quoto, ricavato dalla divisione precedente, sempre per la radice , ricavandone, ogni volta, un nuovo quoto e resto: ogni resto rappresenterà una cifra, di peso sempre maggiore, nel numero di base
.
La serie di divisioni successive si interrompe quando il quoto risultante dall'ultima operazione sarà pari a : in questo caso resto e dividendo (quest'ultimo coincidente con il quoto della divisione immediatamente precedente) saranno uguali, e questa sarà la cifra più significativa (MSD o MSB per i numeri binari) del numero convertito.
Questi passaggi sono riassunti dallo schema seguente, dove è la radice, o base, del sistema numerico verso cui si vuole trasformare il numero decimale:
Anche se il procedimento di conversione risulta alquanto semplice (solo ripetitivo), vediamo di seguito la sua applicazione per i tre sistemi numerici di nostro interesse: il binario, l'ottale e l'esadecimale:
In tutti e tre gli esempi considereremo la conversione del numero decimale
A) Conversione decimale - binario
Radice sistema numerico
: cifra binaria di peso
Quindi, ordinando le cifre relative al numero binario con il LSB a destra, risulta che:
1759(10) = 11011011111(2)
B) Conversione decimale - ottale
Radice sistema numerico
: cifra ottale di peso
Quindi, ordinando le cifre relative al numero ottale sempre con il LSD a destra, risulta che:
1759(10) = 3337(8)
C) Conversione decimale - esadecimale
Radice sistema numerico
: cifra esadecimale di peso
Nota: ricordate che le cifre da a
, in esadecimale, sono rappresentate con le lettere da
ad
.
Quindi, ordinando le cifre relative al numero esadecimale sempre con il LSD a destra, risulta che:
1759(10) = 6DF(16)
In definitiva abbiamo ricavato che
.
Metodo delle moltiplicazioni successive
A differenza di quello appena descritto, il metodo delle moltiplicazioni successive serve alla conversione di un numero decimale compreso tra e
, ovvero della parte frazionaria di un numero decimale.
La rappresentazione che verrà data qui dei numeri frazionari è detto a virgola fissa o fixed point.
Nei successivi articoli confronteremo questo metodo di rappresentazione con un altro detto a virgola mobile o floating point, analizzando pregi e difetti di ognuno. |
In questo caso si tratta di moltiplicare, una prima volta, la parte frazionaria del numero decimale, compresa della cifra , per la radice, o base,
del sistema numerico verso cui vogliamo effettuare la conversione.
Del prodotto così ottenuto si separa:
- La parte intera, che rappresenterà la cifra con peso maggiore (*) del numero verso cui stiamo effettuando la conversione.
- La parte frazionaria, che verrà utilizzata nelle moltiplicazioni successive.
Successivamente si moltiplicherà, ripetutamente, la parte frazionaria, ricavato dalla moltiplicazione precedente, sempre per la radice , ricavandone, ogni volta, un nuovo prodotto dal quale separeremo parte intera e parte frazionaria: ogni parte intera rappresenterà una cifra, di peso sempre minore (*), nel numero di base
.
(*) Ricordiamo quanto visto in LogicBignami (IX): per i numeri compresi tra
![]() ![]() |
La serie di moltiplicazioni successive si possono interrompere per due motivi:
1) Perchè nell'ultimo prodotto effettuato la parte frazionaria è risultata pari a : in tal caso la conversione verso il sistema numerico scelto sarà esatta.
2) Perchè si è raggiunto il limite di cifre desiderate per la rappresentazione, approssimata, della parte frazionaria del numero decimale.
Tali passaggi possono essere riassunti dallo schema seguente, dove è la radice, o base, del sistema numerico verso cui si vuole trasformare il numero decimale:
A questo punto conviene aprire una parentesi sul numero di cifre da considerare nel numero convertito in uno dei sistemi binario, ottale o esadecimale.
Il minimo valore rappresentabile, dato un certo numero di cifre frazionarie, sarà pari:
per il sistema numerico binario
per il sistema numerico ottale
per il sistema numerico esadecimale
Ora è chiaro che se convertiamo un numero decimale frazionario di cifre nel corrispondente numero esadecimale, e utilizziamo, per quest'ultimo, lo stesso numero di cifre (nel caso in cui la conversione esatta non si interrompa ad numero inferiore di cifre), il numero che otterremo avrà, comunque, una "precisione" maggiore, infatti risulterà sempre valida la disuguaglianza:
![]() |
Con la conversione verso il sistema ottale, invece, il discorso si ribalta: se manteniamo lo stesso numero di cifre (sempre a condizione che non si ottenga una conversione esatta con un numero inferiore di cifre) rispetto a quelle utilizzate nel numero decimale, otteniamo un numero con una "precisione " inferiore.
Infatti, in tal caso, varrà la seguente disequazione:
![]() |
Se, nella conversione da un numero decimale ad un numero ottale si desidera una "precisione" maggiore, allora, si dovrà considerare di aggiungere al numero ottale una cifra frazionaria, rispetto al corrispondente numero decimale, durante l'operazione di conversione.
Nella conversione verso il sistema numerico binario è lampante che non è possibile utilizzare lo stesso numero di cifre frazionarie del corrispondente numero decimale in quanto:
![]() |
In questo caso la scelta del numero di cifre frazionarie da considerare nel numero binario, per avere una "precisione" simile al corrispondente numero decimale, si può ricavare imponendo che il peso dell'ultima cifra frazionaria binaria sia minore o uguale al peso dell'ultima cifra frazionaria decimale
:
passando ai logaritmi troviamo
che equivale a
Visto che deve essere un numero intero in quanto rappresenta il numero delle cifre del numero frazionario binario, per via del segno di disuguaglianza, il risultato dovrà essere approssimato per eccesso:
![]() |
Quindi se, ad esempio, dobbiamo convertire un numero frazionario decimale di cifre, noi avremo bisogno di
bit in un numero frazionario binario.
Infatti con bit otteniamo una "precisione" migliore di
, in quanto risulta essere pari a
.
Chiudiamo, quindi, questa parentesi sul numero di cifre frazionarie necessarie nella conversione dal sistema numerico decimale e vediamo l'applicazione della regola di conversione.
Per tutti e tre i sistemi numerici (binario, ottale e esadecimale) cosidereremo la conversione del numero decimale .
A) Conversione decimale - binario
Radice sistema numerico
: cifra binaria di peso
Visto che il numero decimale è rappresentato al millesimo, se la conversione non dovesse risultare esatta considereremo, al massimo, bit.
... a questo punto, non avendo raggiunto il valore esatto ci fermiamo, come stabilito, al decimo bit e consideriamo il numero convertito nel numero binario, approssimato,
.
Nota: Nel numero le ultime due cifre, essendo a
, possono essere omesse: sono state indicate per indicare che la conversione è proseguita fino al decimo bit.
Per vedere a che valore approssimato corrisponde il numero binario così trovato, basta applicare la formula già incontrata nell'articolo LogicBignami (IX), considerando solo la parte relativa ai pesi da a scendere:
dove si ricava che .
B) Conversione decimale - ottale
Radice sistema numerico
: cifra ottale di peso
Anche in questo caso, visto che il numero decimale è rappresentato al millesimo, se la conversione non dovesse risultare esatta, considereremo, per quanto detto in precdenza, al massimo, cifre.
.... anche in questo caso non abbiamo ottenuto un valore esatto, per cui ci fermiamo alla quarta cifra frazionaria, considerando il numero decimale convertito nel corrispondente numero ottale approssimato
, che corrispondrebbe, in realtà a:.
dove si ricava che .
C) Conversione decimale - esadecimale
Radice sistema numerico
: cifra esadecimale di peso
Con la conversione verso il sistema numerico esadecimale tenimo lo stesso numero di cifre frazionarie del numero decimale di partenza, cioè , salvo il caso in cui il processo di conversione si arresti prima in quanto esatta.
.... non avendo raggiunto un valore esatto, come stabilito ci fermiamo alla terza cifra frazionaria, considerando il numero decimale convertito nel corrispondente numero esadecimale approssimato
, che corrispondrebbe, in realtà a:.
dove si ricava che .
Quindi, in definitiva, abbiamo ottenuto che:
I numeri periodici
Esiste anche un caso particolare in cui il procedimento di conversione si potrebbe interrompere prima del raggiungimento del numero di cifre prestabilite perchè ci si ritrova con un numero periodico (semplice o misto).
Questo si evidenzia quando, nell'eseguire uno dei prodotti ci si ritrova con una parte frazionaria uguale ad una ottenuta in una operazione precedente: in questo frangente, da questo punto in poi, la sequenza di prodotti successivi si ripeterà sempre identica, rappresentando la parte periodica del numero frazionario.
Facciamo un esempio convertendo il numero decimale nel corrispondente numero binario:
Essendo il numero decimale espresso al decimo, preventiviamo, nel caso in cui la conversione non risulti esatta, di utilizzare, al massimo, bit.
Abbiamo raggiunto il limite del numero di bit che ci eravamo proposti ma notiamo che la parte frazionaria dell'ultimo prodotto è, in questo caso, uguale al numero decimale di partenza quindi la procedura potrebbe continuare all'infinito ripetendo questi passaggi.
In pratica il numero decimale corrisponde al numero binario periodico
.
Metodo delle sottrazioni successive
Questo metodo, applicabile essenzialmente per la conversione solo verso i numeri binari si basa sull'utilizzo di una tabella precompilata ed è utilizzabile sia per la conversione di numeri decimali interi sia di numeri decimali frazionari
.
La tabella da utilizzare è, come utilizzo, simile a quella incontrata nell'articolo LogicBignami (IX) in merito alla conversione opposta, ossia da un numero binario verso un numero decimale:
Quella qui disegnata, come si può notare, utilizza bit per la parte intera e
bit per la parte frazionaria quindi, il massimo numero decimale intero convertibile sarà pari a
mentre il minimo numero decimale frazionario, per le motivazioni illustrate nel paragrafo precedente, sarà pari a
.
Il suo utilizzo è semplice, come al solito si divide la parte intera da quella frazionaria del numero decimale quindi si procede con i seguenti passi:
Parte intera
1) Si individua la riga corrispondente ad un valore tale per cui 2n + 1 > N(10)
2) In corrispondenza di questa riga si setta a il bit equivalente.
3) Si trova il valore differenza N(10) − 2n.
4) Si ripete dal punto 1) sostituendo a N(10) il valore differenza trovato al punto 2)
Si reiterano i vari passaggi fino a quando al punto 3) la differenza vale .
Il numero binario intero sarà formato da tutti i bit, a partire dal quello di peso a salire, fino all'ultimo settato a
: tutti i bit compresi tra questi estremi, non settati a
in seguito all'esecuzione della procedura su indicata, sono da considerarsi a
.
Parte frazionaria
Si procede con gli stessi passaggi illustrati per la conversione della parte intera, l'unica differenza, come illustrato anche nel paragrafo precedente , è che la conversione potrebbe non arrivare ad avere un valore differenza uguale a in quanto la conversione del numero decimale frazionario non è esattamente convertibile nel corrispondente numero frazionario binario.
In questo caso, come già detto, la conversione si arresterà ad un determinato numero di bit in base alle cifre frazionarie del numero decimale:
- bit per numeri decimali frazionari che si fermano al decimo
- bit per numeri decimali frazionari che si fermano al centesimo
- bit per numeri decimali frazionari che si fermano al millesimo
Vediamo, in pratica, il suo utilizzo eseguendo la conversione del numero decimale , illustrando come si giunge alla compilazione della seguente tabella:
Iniziamo dalla parte intera, e, come detto, cerchiamo il valore di
tale per cui
.
Vediamo dalla tabella che corrisponde a , quindi eseguiamo la prima differenza 1725 − 1024 = 701 e settiamo a
il bit corrispondente a 210.
Ripetiamo i passaggi considerando il numero trovato in precedenza e ricaviamo che il valore
utilizzabile è pari a
corrispondente al bit di peso 29, che setteremo a
, da cui otteniamo la differenza
.
Continuando con la sequenza di differenze troveremo:
- bit di peso , differenza
- bit di peso , differenza
- bit di peso , differenza
- bit di peso , differenza
- bit di peso , differenza
- bit di peso , differenza
Tutti i bit corrispondenti saranno settati a , viceversa, quelli che non sono stati coinvolti nelle operazioni di differenza, fino al peso
(corrispondente al nostro MSB) saranno tutti settati a
.
Analogamente si procede per la parte frazionaria , da cui otteniamo la seguente sequenza di differenze:
- bit di peso , differenza
- bit di peso , differenza
a questo punto il prossimo peso 2n che ci permetterebbe di eseguire la differenza equivarrebbe a 2 − 8 ma, essendo il numero decimale frazionario espresso in centesimi, il nostro numero binario frazionario lo approssimiamo, al massimo, con bit per cui possiamo fermare la nostra conversione qui, in quanto i bit da
a
verrebbero settati a
.
Come per la parte intera anche per la parte frazionaria vengono settati a tutti i bit che sono rientrati in una operazione di differenza e a
i restanti fino al bit di peso minore (corrispondente al nostro LSB) settato a
.
Dalla tabella risulta allora che , infatti, come si dimostra mediante l'applicazione della nota formula, abbiamo che 11010111101,011(2) = 1725,375(10).
Ricordando quanto si è detto nell'articolo LogicBignami (IX) in merito alla conversione di un numero binario in un numero ottale (o esadecimale) e viceversa, la suddetta tabella può essere impiegata anche per passare dal sistema numerico decimale verso il sistema numerico ottale (o esadecimale) passando attraverso la conversione verso il sistema numerico binario, in pratica eseguendo un doppio passaggio:
![]() |
Conversione da sistema numerico ottale a esadecimale e viceversa
Per le stesse motivazioni appena esposte a fine paragrafo precedente, è possibile convertire un numero ottale in un numero esadecimale, e viceversa, semplicemente passando attraverso la conversione verso il sistema numerico binario:
![]() |
Riporto come promemoria di quanto già illustrato in LogicBignami (IX).
Considerando la seguente tabella che accoppia i numeri in binario ai corrispondenti numeri in ottale e esadecimale, è possibile ottenere in maniera semplice la conversione, cifra per cifra, tra l'uno o l'altro sistema numerico:
Supponendo, ad esempio, di voler convertire il numero ottale in un numero esadecimale, dovremmo, inanzi tutto trasformare ogni singola cifra del numero ottale nei corrispondenti gruppi di
bit per formare il numero binario equivalente completo.
Nel nostro caso avremmo:
- 5(8) = 101(2)
- 7(8) = 111(2)
- 1(8) = 001(2)
per la parte intera e
- 3(8) = 011(2)
- 6(8) = 110(2)
per la parte frazionaria, quindi 571,36(8) = 101111001,011110(2)
Questo numero binario verrà quindi convertito nel numero esadecimale suddividendo i bit in gruppi di a partire dalla "virgola": a destra per la parte frazionaria e a sinistra per la parte intera, aggiungendo degli
in fondo e all'inizio per completare, eventualmente, il quartetto di bit.
Quindi:
per la parte intera, dalla "virgola" a salire
- 1001(2) = 9(16)
- 0111(2) = 7(16)
- Nota: i tre bit a
sono stati aggiunti per completare il quartetto
mentre, per la parte frazionaria, dalla "virgola" a scendere
- 0111(2) = 7(16)
- Nota: i due bit a
sono stati aggiunti per completare il quartetto
In definitiva 101111001,011110(2) = 179,78(16), per cui abbiamo ottenuto che:
.
Il tutto è illustrato anche dallo schema qui sotto riportato.
Fino ad ora abbiamo considerato solo la conversione di numeri positivi, nel prossimo articoli vedremo come vengono rappresentati i numeri negativi, il confronto tra i numeri fixed point e floating point nonchè l'esecuzione delle principali operazioni aritmetiche, il tutto rivolto, soprattutto, al sistema numerico binario.