Come annunciato in chiusura dell'articolo precedente (LogicBignami (VIII)) prima di illustrare come funziono alcuni dispositivi standard (cioè realizzati tramite un unico dispositivo integrato) realizzati in "logica combinatoria", analizzeremo i sistemi di numerazione (e codifica), questo perchè molti di questi circuiti sono stati realizzati proprio per manipolare numeri e/o codici.
Indice |
I sistemi di numerazione (prima parte)
Alcune definizioni basilari
I sistemi numerici che analizzeremo saranno tutti del tipo posizionale/pesato, intendendo che il valore assunto da una cifra (o digit) appartenente ad un numero qualsiasi, dipende, oltre che dal valore assunto dalla cifra stessa, anche dalla posizione che questa occupa all'interno del numero stesso.
L'esempio più semplice ci viene dal sistema decimale che usiamo tutti i giorni: in questo sistema sappiamo che ogni cifra può assumere un valore intero compreso tra e
e, a seconda della posizione che assume all'interno del numero stesso, viene moltiplicata per potenze di
.
Così, in un numero intero, la prima cifra più a destra verrà moltiplicata per la potenza , poi spostandosi di una posizione a sinistra, per la potenza
, spotandosi ancora di una posizione a sinistra, per la potenza
e così via:
Ad esempio, il numero , nel sistema decimale equivale al numero di valore
.
In generale nei sistemi numerici di tipo posizionale/pesato:
1)Un numero intero, è rappresentabile con la seguente formula:
![]() |
dove
- è la radice o base del sistema di numerazione, e rappresenta l'insieme di caratteri (ossia il numero dei caratteri), diversi, utilizzabili in ogni singola cifra nel sistema di numerazione stesso
- è la cifra del numero considerato, con
, e
- è il numero delle cifre che compongono il numero Nr
- è la cifra più significativa (detta anche MSD - Most Significant Digit)
- è la cifra meno significativa (detta anche LSD - Least Significant Digit)
Il valore decimale , del numero intero
, è dato dalla relazione
![]() |
2) Un numero frazionario, è rappresentabile con la seguente formula:
![]() |
dove, rispetto al caso precedente, abbiamo che
di
- è la cifra del numero considerato, con
, e
n + m
- è il numero di cifre che compongono il numero
: la parte intera composta da
cifre e la parte frazionaria da
cifre
d − m
- è la cifra meno significativa (detta anche LSD - Least Significant Digit)
Per il numero frazionario, il valore decimale del numero Nr è dato dalla relazione
![]() ![]() |
La conversione inversa, ossia da un numero decimale verso un numero di una qualsiasi base (o radice)
la analizzeremo più avanti, dopo la presentazione dei sistemi numerici che hanno maggior attinenza con questa serie di articoli.
I sistemi numerici non decimali
Verranno, di seguito, analizzati, i principali sistemi di numerazione tipicamente utilizzati nell'elettronica digitale.
In particolare analizzeremo: il sistema numerico binario , il sistema numerico ottale e il sistema numerico esadecimale.
Di questi, il primo, il sistema numerico binario è, come vedremo, quello che viene direttamente "elaborato" tramite segnali elettrici dai circuiti digitali basati sull'algebra booleana (a due valori) e sarà, quindi, quello che approfondiremo di più.
Gli altri due sistemi numerici permettono di rappresentare numeri in una forma più compatta e "leggibile" del corrispondente numero binario, pertanto sono utilizzati perchè permettono una più facile memorizzazione, rappresentazione e trattamento da parte dell'uomo.
Rappresentazione del sistema numerico binario N2
Il sistema numerico binario, in base alle definizioni illustrate in precedenza precedente, è così caratterizzato:
Radice o base r = 2
Ogni singola cifra del numero binario, utilizza due soli caratteri (da qui il nome del sistema) a cui viene associato il valore di e
.
La singola cifra di un numero binario prende il nome di bit, dall'abbreviazione delle parole binary digit (cifra binaria), e viene indicata con la lettera minuscola b.
Il fatto di utilizzare solo due valori per rappresentare le singole cifre, rende, di fatto, un numero binario direttamente manipolabile tramite circuiti elettronici basati sull'algebra booleana (a due valori): in pratica si può far coincidere lo stato logico assunto da una variabile booleana al valore espresso da un bit.
Formula generale di un numero binario:
Per i numeri binari si definiscono:
bn − 1
- la cifra più significativa: MSB (Most Significant Bit)
b − m
- la cifra meno significativa: LSB (Least Significant Bit)
In un numero binario frazionario è evidente quale sia il LSB e quale il MSB, in un numero binario intero, invece, ne andrebbe sempre specificata la posizione perchè varia il "peso" delle singole cifre e quindi il valore finale attribuito a tutto il numero.
In questi articoli, per mantenere l'equivalenza con la rappresentazione dei numeri decimali interi, il LSB dei numeri binari interi sarà da intendere sempre la cifra all'estrema destra del numero stesso, in pratica come rappresentato qui sotto.
I numeri binari si leggono scandendo le singole cifre, cosi, ad esempio, il numero
![]() |
Valore decimale del corrispondente numero binario
:
Ad esempio il numero binario ha:
cifre per la parte intera
cifre per la parte frazionaria
per tanto il numero decimale equivalente sarà:
Quanto appena sopra descritto vale per i cosiddetti numeri in binario naturale, più avanti, nel corso di questa trattazione, quando analizzeremo i codici binari, vedremo che esistono diversi altri modi di rappresentare un numero binario.
Comunque, di seguito, in queste trattazioni, se non diversamente evidenziato, ogni numero binario riportato sarà da considerare del tipo naturale.
Per conoscere il valore massimo del numero decimale intero che può essere rappresentato con un numero binario intero di bit non è necessario eseguire le suddette somme ponendo tutti i termini
al valore
, ma basta affidarsi al Teorema della somma dei termini consecutivi delle progressioni geometriche (ricavabile da un corso di matematica degli istituti superiori):
![]() |
Quindi, volendo fare un esempio, un numero binario intero da bit, può, al massimo, rappresentare un numero decimale intero pari a
.
Considerando che, un numero binario intero di bit può rappresentare numeri decimali interi a partire, ovviamente, dal valore
fino al valore
, allora, per estensione, possiamo affermare che il numero massimo di combinazioni possibili (intese come numero massimo di valori diversi), per un numero binario intero vale:
![]() |
Per l'operazione opposta, ossia trovare quanti bit servano per rappresentare un numero decimale intero qualsiasi, dobbiamo fare alcune osservazioni.
Sappiamo che, nel sistema numerico decimale, l'espressione rappresenta il più piccolo numero intero composto da
cifre, pari a
seguito da
zeri, e che, con
cifre il massimo valore intero esprimibile è 10d − 1.
Abbiamo, poi, appena visto che, il massimo valore di un numero decimale intero ottenibile da un numero binario intero di bit è pari a
.
Possiamo allora scrivere la seguente espressione che ci permette di ricavare il numero di bit necessari a rappresentare un numero decimale intero:
ossia
visto che a noi interessa ricavare il numero di bit , passiamo ai logaritmi in base
In definitiva, il numero minimo di bit necessari per esprimere un numero decimale intero composto da
cifre equivale alla parte intera (il bit è un'unità minima non frazionabile) aumentata di una unità (c.d. Parte intera superiore o ceiling) dell'espressione
, quindi avremo:
![]() |
Se, ad esempio, volessimo rappresentare un numero decimale intero di cifre, cioè compreso tra
e
, nel corrispondente numero binario, avremo bisogno, almeno di
bit
difatti con bit, riusciamo a rappresentare un numero decimale intero di valore massimo pari a
, viceversa, con soli
bit, ci saremo fermati al valore di
riuscendo a coprire poco più del
del valore massimo ottenibile con un numero decimale intero di
cifre.
Per evitare di dover calcolare tutte le volte il valore decimale dei singoli bit, è possibile, semplicemente eseguendo delle somme, trasformare un numero binario naturale nel corrispettivo numero decimale, costruendosi una particolare tabella, con:
- una colonna che rappresenta i singoli bit: dal bit a salire per la parte intera del numero binario e a scendere per la parte frazionaria
- una colonna che rappresenta, per ogni bit il corrispondente valore decimale.
Esempio, la seguente tabella è utilizzabile per numeri binari fino a bit per la parte intera e fino a
bit per la parte frazionaria (ricordo che parliamo sempre di numeri binari naturali):
Nota: nella parte esterna della tabella è riportato l'andamento del valore dell'esponente relativo al "peso"
associato al relativo bit
così, se volessimo conoscere il numero decimale corrispondente al numero binario , basterebbe inserirlo nella tabella, facendo coincidere il primo bit alla sinistra della virgola con la posizione
, e sommare i valori decimali corrispondenti esclusivamente ai valori
(evidenziati in verde, nella tabella qui sotto) del numero binario:
Nel prossimo articolo, quando analizzeremo i sistemi per convertire i numeri decimali in numeri binari vedremo che questa tabella è utile anche per il sistema di conversione denominato delle sottrazioni successive.
Nomenclatura
Ad alcuni raggruppamenti di bit è stato, storicamente, assegnato un determinato nome, i più comuni che incontreremo anche nel corso di questi articoli sono:
bit - denominato nibble
bit - denominato byte (da bynary octette, ottetto binario), indicato con la lettera maiuscola B
Inoltre, in un contesto, però, che esula questi articoli in quanto più orientata ai linguaggi di programmazione per microprocessori, abbiamo la definizione di word: essa rappresenta la dimensione, come numero di bit, dei dati che possono essere maneggiati da un sistema di elaborazione in un'unica istruzione, e, nell'evoluzione dei microprocessori, ha assunto, nel tempo, valori diversi, i più conosciuti, dal 1970 ad oggi, sono stati bit.
Il bit e il byte hanno assunto anche un significato come unità di misura nel campo delle telecomunicazioni (trasmissione dati) e nei sistemi di elaborazione dati, per questo si possono trovare associati ai classici prefissi moltiplicativi k (kilo-), M (mega-), G (giga-), T (tera-) e, più raramente, P (peta-).
In realtà l'uso di tali prefissi ha generato, in passato, alcune incomprensioni sulla reale "quantità" indicata, questo perchè, secondo il SI, questi rappresentano potenze di crescenti:
k- | 1.000 |
M- | 1.0002 |
G- | 1.0003 |
T- | 1.0004 |
P- | 1.0005 |
Con i numeri binari, cioè con potenze di , il numero che si avvicina di più a
si ottiene con
, che però è pari a
, da cui fu fatta derivare anche la seguente corrispondenza dei medesimi prefissi:
k- | 1.024 |
M- | 1.0242 |
G- | 1.0243 |
T- | 1.0244 |
P- | 1.0245 |
Questo ha creato confusione perchè alcuni consideravano i prefissi come potenze di , mentre altri come potenze di
, senza specificare chiaramente a quale tabella facevano riferimento, per cui si potevano trovare, ad esempio, prodotti le cui prestazioni, pur sembrando numericamente identiche, in realtà erano differenti:
consideriamo un hard disk da (1 terabyte), se non è chiaramente specificato a quale classe di moltiplicatori fare riferimento, non possiamo sapere, a priori, se presenta una capacità di memorizzazione massima pari a
byte oppure di
byte:
miliardi di byte in più rispetto al precedente.
In pratica all'aumentare del fattore moltiplicativo espresso dal prefisso, la differenza tra i due sistemi adottati aumenta, come chiaramente visibile nella tabella qui sotto (parzialmente estratta da Wikipedia):
Prefisso | Binario / Decimale | Decimale / Binario | ||
---|---|---|---|---|
k- | 1,024 (+2,4%) | 0,9766 (−2,3%) | ||
M- | 1,049 (+4,9%) | 0,9537 (−4,6%) | ||
G- | 1,074 (+7,4%) | 0,9313 (−6,9%) | ||
T- | 1,100 (+10,0%) | 0,9095 (−9,1%) | ||
P- | 1,126 (+12,6%) | 0,8882 (−11,2%) |
In questa tabella troviamo, nella colonna Binario / Decimale il rapporto tra la quantità espressa con potenze di rispetto alle corrispondenti espresse con potenze di
, viceversa nella colonna Decimale / Binario: i grafici mostrano chiaramente la differenza (in più o in meno) che si ottengono nei rapporti tra le due fomre.
Per eliminare queste discrepanze ed evitare ambiguità, dal 1998 la IEC (International Electrotechnical Commission), in collaborazione con diverse organizzazioni di standardizzazione delle misure (NIST - National Institute of Standard Tecnologies, ISO - International Standard Organizzation, ...), ha definito, per i moltiplicatori potenze di una nuova serie di prefissi da usare come standard, qui sotto indicati con la relativa denominazione:
ki- | kibi- | 1.024 |
Mi- | mebi- | 1.0242 |
Gi- | gibi- | 1.0243 |
Ti- | tebi- | 1.0244 |
Pi- | pebi- | 1.0245 |
Cosi, ad esempio:
avendo a disposizione due dispositivi di trasmissione dati, uno con velocità pari a 30 Gib/s, cioè da 30 gibibit al secondo, e un altro con velocità pari a 30 Gb/s, cioè a 30 gigabit al secondo, so già che la prima sarà più prestante perchè, a parità di numero, la prima ha un fattore moltiplicativo (Gi-) più grande della seconda (G-).
Rappresentazione del sistema numerico ottale N8
Il sistema numerico ottale, viene così caratterizzato:
Radice o base r = 8
Ogni singola cifra del numero ottale, utilizza caratteri, cui vengono associati i valori
.
Formula generale di un numero ottale:
Nel caso dei numeri ottali valgono le denominazioni fornite come generali all'inizio per i sistemi numerici di tipo posizionale-pesato.
Al fine di mantenere l'equivalenza con la rappresentazione dei numeri decimali interi, anche per i numeri ottali interi il LSD sarà da intendere sempre la cifra all'estrema destra del numero stesso.
Anche i numeri ottali si dovrebbero leggere scandendo le singole cifre, cosi, ad esempio, il numero si legge: sette, due, uno e non settecentoventuno come un numero decimale, questo per evitare di associare mnemonicamente un valore errato al numero ottale letto.
Valore decimale del corrispondente numero ottale
:
Ad esempio il numero ottale ha:
cifre per la parte intera
cifre per la parte frazionaria
per tanto il numero decimale equivalente sarà:
= 128 + 24 + 4 + 0,625 + 0,015625 = 156,640625
Come abbiamo detto, il sistema numerico ottale, come anche l'esadecimale che vedremo in seguito, permette di rendere più "maneggevoli" i numeri binari.
Dal paragrafo precedente sappiamo che il numero massimo di combinazioni di numeri binari, ottenibili con bit equivale a
e che il massimo valore decimale corrisponde a
.
Considerando gli caratteri che compongono l'insieme dei numeri utilizzabili come cifre in un sistema numerico ottale e facendo coincidere questo numero con il numero massimo di combinazioni ottenibili con un numero binario di
bit, si può ricavare il numero di bit necessari per rappresentare ogni singola cifra ottale con un numero binario:
8 = 2n
esprimendo come potenza di
il risultato è lampante
23 = 2n
n = 3
Quindi un numero binario a bit copre tutte le cifre di un numero ottale, e visto che con
bit si riesce ad esprimere un numero decimale di valore massimo pari a:
23 − 1 = 7
e che i numeri da a
, di un numero ottale coincidono, per valore, al corrispondente numero decimale (come si può anche dimostrare utilizzando la formula del valore decimale corrispondente ad un numero ottale, analizzata poco prima), possiamo fa corrispondere questi numeri con i corrispondenti in binario, secondo questa tabella:
In pratica questa corrispondenza binario - ottale permette una rapida conversione tra questi due sistemi numerici.
Per trasformare un numero binario in un numero ottale basta suddividere il numero binario in gruppi di bit a parire dal LSB, per i numeri interi, procedendo verso sinistra, e aggiungendo, eventualmente, tanti
a sinistra del MSB per completare l'ultimo terzetto e, per i numeri frazionari, partendo dal primo bit a sinistra della virgola (parte intera), procedendo come prima e, a destra della virgola (parte frazionaria), suddividendo in gruppi di
bit procedendo verso destra, aggiungendo, eventualmente, tanti
a destra del LSB sempre per completare l'ultimo terzetto, come riportato nei due esempi seguenti:
Trasformare il numero binario intero nel corrispondente numero ottale.
Partendo dal LSB che, come abbiamo detto, salvo diversa specifica, noi considereremo sempre la cifra all'estrema destra, si riescono ad ottenere due soli gruppi di 3 bit completi, per ottenere il terzo, dobbiamo aggiungere bit a
a sinistra del MSB, a questo punto, come visibile nella figura sotto, l'associazione di valore dei gruppi di bit ci restituisce il corrispondente numero ottale: 115
Trasformare il numero binario frazionario nel corrispondente numero ottale.
In questo caso:
per la parte intera, partiamo dalla virgola e, procedendo verso sinistra riusciamo ad ottenere un unico gruppo completo da bit, per ottenere il successivo dobbiamo aggiungere uno
a sinistra del bit MSB
per la parte frazionaria, sempre partendo dalla virgola e procedendo verso destra, notiamo subito di avere solo bit a disposizione, quindi, per formare il terzetto, aggiungiamo uno
a destra del bit LSB
Ottenuti tutti i raggruppamenti da bit, come illustrato sotto, anche in questo caso la conversione da numero binario a ottale è immediata, e ,ricordandoci la posizione della virgola, otteniamo:
La conversione da numero ottale a numero binario è ancora più immediata in quanto basta trasformare le singole cifre che compongono il numero ottale nei corrispondenti gruppi di bit che ne esprimono il valore in bianrio.
Così, nell'esempio illustrato sotto, si vede che il numero ottale corrisponde, ricordandosi sempre della posizione della virgola, al numero binario
Se si vuole verificare la bontà di queste conversioni basta trasformare, sia il numero binario che il corrispondente numero ottale, in numero decimale:
così, ad esempio, per verificare se, effettivamente 11011,012 = 33,28 abbiamo
per il numero binario
= 16 + 8 + 2 + 1 + 0,25 = 27,25
e per il numero ottale
Come volevasi dimostrare i due risultati sono identici.
All'inizio si è detto che il sistema numerico ottale permette una rappresentazione più "compatta" di un numero binario e quindi più facilmente manipolabile dall'essere umano, questo penso sia stato evidenziato abbastanza bene dagli esempi di conversione poco sopra esposti, dove abbiamo visto come una sequenza di di cifre binarie sono state "compattate" in solo
cifre di un numero ottale.
A breve analizzeremo anche il sistema numerico esadecimale, che offre un altrettanto valido sistema per scrivere un numero binario in maniera più compressa.
Rappresentazione del sistema numerico esadecimale N16
L'ultimo sistema numerico che andremo ad analizzare, per questa serie di articoli, è il sistema numerico esadecimale, che viene così caratterizzato:
Radice o base r = 16
Ogni singola cifra del numero esadecimale, utilizza caratteri:
.
Ai primi dieci corrisponde il relativo valore numerico e alle lettere da ad
corrispondo, rispettivamente, i valori
.
Da notare che i caratteri alfabetici possono essere scritti, indifferentemente, maiuscoli o minuscoli.
Formula generale di un numero esadecimale:
Si è preferito usare la notazione , facendo riferimento alla denominazione inglese hexadecimal, invece della notazione
, che avrebbe fatto riferimento alla denominazione italiana esadecimale per evitare una possibile ambiguità, anche se fuori contesto, con la costante matematica
(Numero di Eulero o Nepero).
Anche per i numeri esadecimali valgono le denominazioni fornite come generali all'inizio per i sistemi numerici di tipo posizionale-pesato.
Sempre per omogeneità di rappresentazione nella continuazione di questi articoli, anche per i numeri esadecimali interi il LSD sarà da intendere la cifra all'estrema destra del numero stesso.
I numeri esadecimali vanno letti scandendo i singoli caratteri, cosi, ad esempio, il numero si legge: ci, a, di, di, e e non cadde come il passato remoto del verbo cadere.
Valore decimale del corrispondente numero esadecimale
:
Ad esempio il numero esadecimale con:
cifre per la parte intera
cifre per la parte frazionaria
equivarrà al numero decimale:
= 3840 + 160 + 1 + 0,6875 + 0,0546875 = 4001,7421875
Nel paragrafo relativo al sistema numerico ottale abbiamo visto che questo riesce a compattare un numero binario, al massimo di un fattore quando il numero binario è composta da un multiplo di
bit.
Anche i numeri esadecimali permettono di "comprimere" al scrittura di un numero binario e lo possono fare in maniera più efficace.
così, considerando i caratteri che compongono l'insieme dei numeri utilizzabili come cifre in un sistema numerico esadecimale e facendo coincidere questo numero con il numero massimo di combinazioni ottenibili con un numero binario di
bit, si può ricavare il numero di bit necessari per rappresentare ogni singola cifra esadecimale con un numero binario:
16 = 2n
esprimendo come potenza di
il risultato è lampante
24 = 2n
n = 4
Quindi un numero binario a bit (i cosiddetti nibble, ricordate?) copre tutte le cifre di un numero esadecimale, e visto che con
bit si riesce ad esprimere un numero decimale di valore massimo pari a:
24 − 1 = 15
e che i numeri da a
, di un numero esadecimale coincidono, per valore, ai numeri decimali da
a
(come si può anche dimostrare utilizzando la formula del valore decimale corrispondente ad un numero esadecimale, analizzata poco prima), possiamo fa corrispondere questi numeri con i corrispondenti in binario, secondo questa tabella:
Da questa tabella risulta subito evidente che i numeri esadecimali riuscendo a rappresentare bit alla volta di un numero binario, permettono, su numeri binari di lunghezza multipla di
bit, di avre una maggior compattezza rispetto ai numeri del sistema numerico ottale.
Tenendo presente che le regole di conversione da numero binario a numero esadecimale sono identiche a quelle viste per la conversione da numero bianrio a numero ottale, solo che, invece di suddividere il numero binario in gruppi di bit, si suddivide in gruppi di
bit:
vediamo, ad esempio su un numero binario da bit, la maggior compattezza offerta dal sistema numerico esadecimale rispetto all'ottale:
Gli spazi inseriti nelle due rappresentazioni dello stesso numero binario sono puramente funzionali per far vedere la suddivisione dei gruppi di bit e permettere una più agevole conversione verso il sistema numerico esadecimale o ottale.
La codifica inversa, da numero esadecimale ad uno binario è alquanto semplice, si tratta di trasformare, in maniera ordinata, le singole cifre esadecimali nei corrispondenti gruppi di bit del numero binario:
essendo le cifre a , all'estrema sinistra della parte intera e all'estrema destra della parte frazionaria, non significative, abbiamo che:
7FD,BC16 = 11111111101,1011112
Quindi, su numeri binari di lunghezza multipla di bit, il grado di compressione effettuato tramite il sistema numerico esadecimale si attesta su un fattore di
, per cui se il numero binario è composta da un numero di bit divisibile sia per
che per
, il sistema numerico esadecimale offre una maggior compattezza rispetto ad un sistema numerico ottale.
D'ora in poi, se non è chiaro dal contesto del discorso, per assegnare il corretto valore ai numeri esposti, questi verranno accompagnati dal pedice rappresentante il sistema numerico a cui appartengono:
12316 = 29110 = 4438 = 1001000112
Con questo abbiamo concluso una prima carrellata sui sistemi numerici, nel prossimo articolo affronteremo i metodi per passare dai numeri decimali ai corrispondenti in binario, ottale e esadecimale.