Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

6
voti

LogicBignami (IX)

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 0 \; e 9 \; (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) \; e, a seconda della posizione che assume all'interno del numero stesso, viene moltiplicata per potenze di 10 \;.

Così, in un numero intero, la prima cifra più a destra verrà moltiplicata per la potenza 10^0 \;, poi spostandosi di una posizione a sinistra, per la potenza 10^1 \;, spotandosi ancora di una posizione a sinistra, per la potenza 10^2 \; e così via:

Ad esempio, il numero 1234 \;, nel sistema decimale equivale al numero di valore 1 \cdot 10^3 + 2 \cdot 10^2 + 3 \cdot 10^1 + 4 \cdot 10^0 \;.

In generale nei sistemi numerici di tipo posizionale/pesato:

1)Un numero intero, è rappresentabile con la seguente formula:

N_r = d_{n-1} \; d_{n-2} \ldots d_2 \; d_1 \; d_0

dove

r \;

è 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

d_i \;

è la cifra del numero considerato, con d_i \in r \;, e 0 \le i \le n-1

n \;

è il numero delle cifre che compongono il numero Nr

d_{n-1} \;

è la cifra più significativa (detta anche MSD - Most Significant Digit)

d_0 \;

è la cifra meno significativa (detta anche LSD - Least Significant Digit)

Il valore decimale N_{10} \;, del numero intero N_r \;, è dato dalla relazione

N_{10} = \sum_{i=0}^{n-1}{d_i\;r^i} = d_{n-1}\;r^{n-1} + d_{n-2}\;r^{n-2} + \ldots + d_2\;r^2 + d_1\;r^1 + d_0\;r^0

2) Un numero frazionario, è rappresentabile con la seguente formula:

N_r = d_{n-1} \; d_{n-2} \ldots d_2 \; d_1 \; d_0,d_{-1} \; d_{-2} \; d_{-3} \ldots d_{-(m-1)} \; d_{-m}

dove, rispetto al caso precedente, abbiamo che

di

è la cifra del numero considerato, con d_i \in r\;, e -m \le i \le n-1

n + m

è il numero di cifre che compongono il numero N_r \;: la parte intera composta da n \; cifre e la parte frazionaria da m \; cifre

dm

è la cifra meno significativa (detta anche LSD - Least Significant Digit)

Per il numero frazionario, il valore decimale N_{10} \; del numero Nr è dato dalla relazione

N_{10} = \sum_{i=-m}^{n-1}{d_i\;r^i} = d_{n-1}\;r^{n-1} + d_{n-2}\;r^{n-2} + \ldots + d_2\;r^2 + d_1\;r^1 + d_0\;r^0 +
+ d_{-1}\;r^{-1} + d_{-2}\;r^{-2} + \ldots + d_{-(m-1)}\;r^{-(m-1)} + d_{-m}\;r^{-m}

La conversione inversa, ossia da un numero decimale N_{10} \; verso un numero di una qualsiasi base (o radice) N_r \; 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 0 \; e 1 \;.

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:

N_2 = b_{n-1} \; b_{n-2} \ldots b_2 \; b_1 \; b_0,b_{-1} \; b_{-2} \; b_{-3} \ldots b_{-(m-1)} \; b_{-m}
Per i numeri binari si definiscono:

bn − 1

la cifra più significativa: MSB (Most Significant Bit)

bm

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.

1\;1\;0\;0\overset {LSB}{1} \;

I numeri binari si leggono scandendo le singole cifre, cosi, ad esempio, il numero 110110_2 \; si legge: uno, uno, zero, uno, uno, zero e non centodiecimilacentodieci come un numero decimale

Valore decimale N_{10} \; del corrispondente numero binario N_2 \;:

N_{10} = \sum_{i=-m}^{n-1}{b_i\;2^i} = b_{n-1}\;2^{n-1} + b_{n-2}\;2^{n-2} + \ldots + b_2\;2^2 + b_1\;2^1 +

+ b_0\;2^0 + b_{-1}\;2^{-1} + b_{-2}\;2^{-2} + \ldots + b_{-(m-1)}\;2^{-(m-1)} + b_{-m}\;2^{-m}

Ad esempio il numero binario N_2 = 11011,01 \; ha:

5 \; cifre per la parte intera (n = 5) \;
2 \; cifre per la parte frazionaria (m = 2) \;

per tanto il numero decimale equivalente sarà:

N_{10} = 1 \cdot 2^4 + 1 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 1 \cdot 2^0 + 0 \cdot 2^{-1} + 1 \cdot 2^{-2} = 16 + 8 + 2 + 1 + 0,25 = 27,25

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 n \; bit non è necessario eseguire le suddette somme ponendo tutti i termini d_{...} \; al valore 1 \;, ma basta affidarsi al Teorema della somma dei termini consecutivi delle progressioni geometriche (ricavabile da un corso di matematica degli istituti superiori):

N_{10_{MAX}} = \sum_{i=0}^{n-1}{1 \cdot \;2^i} = 1 \cdot 2^0 \cdot \frac {1 - 2^n}{1 - 2} = 2^n - 1

Quindi, volendo fare un esempio, un numero binario intero da 9 \; bit, può, al massimo, rappresentare un numero decimale intero pari a 2^9 - 1 = 511 \;.

Considerando che, un numero binario intero di n \; bit può rappresentare numeri decimali interi a partire, ovviamente, dal valore 0 \; fino al valore 2^n - 1 \;, 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:

(2^n - 1) + 1_{(per \; lo \; zero)} = 2^n \;

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 10^d \; rappresenta il più piccolo numero intero composto da d + 1 \; cifre, pari a 1 \; seguito da d \; zeri, e che, con d \; 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 n \; bit è pari a 2^n - 1\;.

Possiamo allora scrivere la seguente espressione che ci permette di ricavare il numero di bit necessari a rappresentare un numero decimale intero:

2^n -1 \ge 10^d - 1 \;

ossia

2^n \ge 10^d \;

visto che a noi interessa ricavare il numero di bit n \;, passiamo ai logaritmi in base 2 \;

\log_2 {2^n} \ge \log_2 {10^d}

n \ge d \cdot \log_2 10

In definitiva, il numero minimo di bit n \; necessari per esprimere un numero decimale intero composto da d \; 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 d \cdot \log_2 10 \;, quindi avremo:

n = \lceil d \cdot \log_2 (10) \rceil = \lfloor d \cdot 3,32 \rfloor + 1

Se, ad esempio, volessimo rappresentare un numero decimale intero di 5 \; cifre, cioè compreso tra 0 \; e 99.999 \;, nel corrispondente numero binario, avremo bisogno, almeno di

n = \lfloor 5 \cdot 3,32 \rfloor + 1 = 17 \; bit

difatti con 17 \; bit, riusciamo a rappresentare un numero decimale intero di valore massimo pari a 2^{17} -1 = 131.071 \; , viceversa, con soli 16 \; bit, ci saremo fermati al valore di 2^{16} - 1 = 65.535 \; riuscendo a coprire poco più del 65 % \; del valore massimo ottenibile con un numero decimale intero di 5 \; 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 1 = (2^0) \; 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 16 \; bit per la parte intera e fino a 8 \; 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 (n) \; relativo al "peso" (2^n) \; associato al relativo bit

così, se volessimo conoscere il numero decimale corrispondente al numero binario 10111001,101 \;, basterebbe inserirlo nella tabella, facendo coincidere il primo bit alla sinistra della virgola con la posizione 0 \;, e sommare i valori decimali corrispondenti esclusivamente ai valori 1 \; (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:

4 \; bit - denominato nibble
8 \; 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 4, \; 8, \; 16, \; 32, \; 64 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 1.000 \; crescenti:

k- 1.000
M- 1.0002
G- 1.0003
T- 1.0004
P- 1.0005

Con i numeri binari, cioè con potenze di 2 \;, il numero che si avvicina di più a 1.000 \; si ottiene con 2^{10} \;, che però è pari a 1.024 \,, 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 1000 \;, mentre altri come potenze di 1024 \;, 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 \; TB \; (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 1.000.000.000.000 \; byte oppure di 1.099.511.627.776 \; byte: 99,5 \; 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 1.024 \; rispetto alle corrispondenti espresse con potenze di 1.000 \;, 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 1.024 \; 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 8 \; caratteri, cui vengono associati i valori 0, \; 1, \; 2, \; 3, \; 4, \; 5, \; 6, \; 7 \;.

Formula generale di un numero ottale:

N_8 = o_{n-1} \; o_{n-2} \ldots o_2 \; o_1 \; o_0,b_{-1} \; o_{-2} \; o_{-3} \ldots o_{-(m-1)} \; o_{-m}

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 721_8 \; 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 N_{10} \; del corrispondente numero ottale N_8 \;:

N_{10} = \sum_{i=-m}^{n-1}{o_i\;8^i} = o_{n-1}\;8^{n-1} + o_{n-2}\;8^{n-2} + \ldots + o_2\;8^2 + o_1\;8^1 +

+ o_0\;8^0 + o_{-1}\;8^{-1} + o_{-2}\;8^{-2} + \ldots + o_{-(m-1)}\;8^{-(m-1)} + o_{-m}\;8^{-m}

Ad esempio il numero ottale N_8 = 234,51 \; ha:

3 \; cifre per la parte intera (n = 3) \;
2 \; cifre per la parte frazionaria (m = 2) \;

per tanto il numero decimale equivalente sarà:

N_{10} = 2 \cdot 8^2 + 3 \cdot 8^1 + 4 \cdot 8^0 + 5 \cdot 8^{-1} + 1 \cdot 8^{-2} =
= 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 n \; bit equivale a 2^n \; e che il massimo valore decimale corrisponde a 2^n - 1 \;.

Considerando gli 8 \; 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 n \; bit, si può ricavare il numero di bit necessari per rappresentare ogni singola cifra ottale con un numero binario:

8 = 2n

esprimendo 8 \; come potenza di 2 \; il risultato è lampante

23 = 2n

n = 3

Quindi un numero binario a 3 \; bit copre tutte le cifre di un numero ottale, e visto che con 3 \; bit si riesce ad esprimere un numero decimale di valore massimo pari a:

23 − 1 = 7

e che i numeri da 0 \; a 7 \;, 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 3 \; bit a parire dal LSB, per i numeri interi, procedendo verso sinistra, e aggiungendo, eventualmente, tanti 0 \; 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 3 \; bit procedendo verso destra, aggiungendo, eventualmente, tanti 0 \; a destra del LSB sempre per completare l'ultimo terzetto, come riportato nei due esempi seguenti:

Trasformare il numero binario intero 1001101 \; 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 2 \; bit a 0 \; 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 11011,01 \; 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 3 \; bit, per ottenere il successivo dobbiamo aggiungere uno 0 \; a sinistra del bit MSB

per la parte frazionaria, sempre partendo dalla virgola e procedendo verso destra, notiamo subito di avere solo 2 \; bit a disposizione, quindi, per formare il terzetto, aggiungiamo uno 0 \; a destra del bit LSB

Ottenuti tutti i raggruppamenti da 3 \; bit, come illustrato sotto, anche in questo caso la conversione da numero binario a ottale è immediata, e ,ricordandoci la posizione della virgola, otteniamo: 33,2 \;

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 3 \; bit che ne esprimono il valore in bianrio.

Così, nell'esempio illustrato sotto, si vede che il numero ottale 463,15 \; corrisponde, ricordandosi sempre della posizione della virgola, al numero binario 100110011,001101 \;

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

N_{10} = 1 \cdot 2^4 + 1 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^2 + 1 \cdot 2^0 + 0 \cdot 2^{-1} + 1 \cdot 2^{-2} =
= 16 + 8 + 2 + 1 + 0,25 = 27,25

e per il numero ottale

N_{10} = 3 \cdot 8^1 + 3 \cdot 8^0 + 2 \cdot 8^{-1} = 24 + 3 + 0,25 = 27,25

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 15 \; cifre binarie sono state "compattate" in solo 5 \; 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 16 \; caratteri:0, \; 1, \; 2, \; 3, \; 4, \; 5, \; 6, \; 7, \; 8, \; 9, \; A, \; B, \; C, \; D, \; E, \; F \;.

Ai primi dieci corrisponde il relativo valore numerico e alle lettere da A \; ad F \; corrispondo, rispettivamente, i valori 10, \; 11, \; 12, \; 13, \; 14, \; 15 \;.

Da notare che i caratteri alfabetici possono essere scritti, indifferentemente, maiuscoli o minuscoli.

Formula generale di un numero esadecimale:

N_{16} = h_{n-1} \; h_{n-2} \ldots h_2 \; h_1 \; h_0,h_{-1} \; h_{-2} \; h_{-3} \ldots h_{-(m-1)} \; h_{-m}

Si è preferito usare la notazione h_{...} \;, facendo riferimento alla denominazione inglese hexadecimal, invece della notazione e_{...} \;, che avrebbe fatto riferimento alla denominazione italiana esadecimale per evitare una possibile ambiguità, anche se fuori contesto, con la costante matematica e \; (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 CADDE_{16} \; si legge: ci, a, di, di, e e non cadde come il passato remoto del verbo cadere.

Valore decimale N_{10} \; del corrispondente numero esadecimale N_{16} \;:

N_{10} = \sum_{i=-m}^{n-1}{h_i\;16^i} = h_{n-1}\;16^{n-1} + h_{n-2}\;16^{n-2} + \ldots + h_2\;16^2 + h_1\;16^1 +

+ h_0\;16^0 + h_{-1}\;16^{-1} + h_{-2}\;16^{-2} + \ldots + h_{-(m-1)}\;16^{-(m-1)} + h_{-m}\;16^{-m}

Ad esempio il numero esadecimale N_{16} = FA1,BE \; con:

3 \; cifre per la parte intera (n = 3) \;
2 \; cifre per la parte frazionaria (m = 2) \;

equivarrà al numero decimale:

N_{10} = 15 \cdot 16^2 + 10 \cdot 16^1 + 1 \cdot 16^0 + 11 \cdot 16^{-1} + 14 \cdot 16^{-2} =
= 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 1 : 3 \; quando il numero binario è composta da un multiplo di 3 \; 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 16 \; 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 n \; bit, si può ricavare il numero di bit necessari per rappresentare ogni singola cifra esadecimale con un numero binario:

16 = 2n

esprimendo 16 \; come potenza di 2 \; il risultato è lampante

24 = 2n

n = 4

Quindi un numero binario a 4 \; bit (i cosiddetti nibble, ricordate?) copre tutte le cifre di un numero esadecimale, e visto che con 4 \; bit si riesce ad esprimere un numero decimale di valore massimo pari a:

24 − 1 = 15

e che i numeri da 0 \; a F \;, di un numero esadecimale coincidono, per valore, ai numeri decimali da 0 \; a 15 \; (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 4 \; bit alla volta di un numero binario, permettono, su numeri binari di lunghezza multipla di 4 \; 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 3 \; bit, si suddivide in gruppi di 4 \; bit:

vediamo, ad esempio su un numero binario da 12 \; bit, la maggior compattezza offerta dal sistema numerico esadecimale rispetto all'ottale:

(1101 \; 0101 \; 0010)_2 = D52_{16}

(110 \; 101 \; 010 \; 010)_2 = 6522_8

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 4 \; bit del numero binario:

essendo le cifre a 0 \;, 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 4 \; bit, il grado di compressione effettuato tramite il sistema numerico esadecimale si attesta su un fattore di 1 : 4 \;, per cui se il numero binario è composta da un numero di bit divisibile sia per 3 \; che per 4 \;, 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.

LogicBignami - Indice articoli correlati

4

Commenti e note

Inserisci un commento

di ,

... tra un po' lo potremmo dare alle stampe con la "Casa Editrice EY"...

Rispondi

di ,

LogicBignami, sta diventando un book .. grande Max2433BO

Rispondi

di ,

Grazie mille, clavicordo!!!

Rispondi

di ,

Ottimo!

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.