# Sistema numerico esadecimale

Il sistema numerico esadecimale (spesso abbreviato come esa o hex) è un sistema numerico posizionale in base 16, cioè che utilizza 16 simboli invece dei 10 del sistema numerico decimale tradizionale. Per l'esadecimale si usano in genere i simboli da $0$ a $9$ per le prime dieci cifre e poi le lettere da $A$ a $F$ per le successive sei cifre, per un totale di 16 simboli.

## Rappresentazione

Ecco una tabella che confronta le rappresentazioni esadecimali, decimali, ottali e binarie dei numeri fino a 15:
| 0$_{hex}$ | = | 0$_{dec}$ | = | 0$_{oct}$ | 0 | 0 | 0 | 0 |
| 1$_{hex}$ | = | 1$_{dec}$ | = | 1$_{oct}$ | 0 | 0 | 0 | 1 |
| 2$_{hex}$ | = | 2$_{dec}$ | = | 2$_{oct}$ | 0 | 0 | 1 | 0 |
| 3$_{hex}$ | = | 3$_{dec}$ | = | 3$_{oct}$ | 0 | 0 | 1 | 1 |
| 4$_{hex}$ | = | 4$_{dec}$ | = | 4$_{oct}$ | 0 | 1 | 0 | 0 |
| 5$_{hex}$ | = | 5$_{dec}$ | = | 5$_{oct}$ | 0 | 1 | 0 | 1 |
| 6$_{hex}$ | = | 6$_{dec}$ | = | 6$_{oct}$ | 0 | 1 | 1 | 0 |
| 7$_{hex}$ | = | 7$_{dec}$ | = | 7$_{oct}$ | 0 | 1 | 1 | 1 |
| 8$_{hex}$ | = | 8$_{dec}$ | = | 10$_{oct}$ | 1 | 0 | 0 | 0 |
| 9$_{hex}$ | = | 9$_{dec}$ | = | 11$_{oct}$ | 1 | 0 | 0 | 1 |
| A$_{hex}$ | = | 10$_{dec}$ | = | 12$_{oct}$ | 1 | 0 | 1 | 0 |
| B$_{hex}$ | = | 11$_{dec}$ | = | 13$_{oct}$ | 1 | 0 | 1 | 1 |
| C$_{hex}$ | = | 12$_{dec}$ | = | 14$_{oct}$ | 1 | 1 | 0 | 0 |
| D$_{hex}$ | = | 13$_{dec}$ | = | 15$_{oct}$ | 1 | 1 | 0 | 1 |
| E$_{hex}$ | = | 14$_{dec}$ | = | 16$_{oct}$ | 1 | 1 | 1 | 0 |
| F$_{hex}$ | = | 15$_{dec}$ | = | 17$_{oct}$ | 1 | 1 | 1 | 1 |
Perciò il numero decimale 143, la cui rappresentazione binaria è $1000\,1111$, può essere scritto come $8F$ in esadecimale.

## Informatica

Il sistema esadecimale è molto usato in informatica, in quanto una cifra esadecimale è esattamente equivalente in termini di significato numerico a quattro cifre binarie, ovvero a quello che viene comunemente chiamato nibble. È spesso usato come intermediario, oppure come sistema numerico a sé stante. Per esempio, è possibile esprimere un byte con esattamente due cifre esadecimali.
Ci sono numerosi modi per denotare un numero come esadecimale, usati in differenti linguaggi di programmazione e di descrizione hardware:
* Ada e VHDL racchiudono i numeri in "virgolette numeriche" che riportano anche la base, per esempio 16#5A3# (Nota: Ada accetta questa notazione per tutte le basi dalla 2 alla 16 e per numeri sia interi che non).
* Il C e i linguaggi con una sintassi simile (come il Java) usano il prefisso 0x, per esempio 0x5A3. Lo zero iniziale è presente perché i numeri devono tutti necessariamente iniziare con un carattere numerico, mentre la x indica l'uso del sistema esadecimale (se si usa come prefisso solo 0, senza x, il linguaggio C interpreta il numero come ottale, mentre se non si usa nessun prefisso il numero viene interpretato come decimale).
* Il Pascal e alcuni Assembly indicano l'esadecimale con il suffisso h; se il numero inizia con una lettera, si usa anche il prefisso 0). Esempi: 0A3Ch, 5A3h.
* Altri assembly (AT&T, Motorola) e alcune versioni di BASIC usano il prefisso $, per esempio $5A3.
* Altre versioni del BASIC usano il prefisso &h, per esempio &h5A3.
* Quando usano sistemi di numerazione diversi dalla base dieci, o numerali in basi multiple, i matematici scrivono la base come pedice del numero, per esempio $5A3_{16}$ oppure $5A3_{SEDICI}$.
Non esiste un simbolo standard, perciò tutte le convenzioni elencate sopra vengono utilizzate, e a volte lo stesso articolo può contenere due convenzioni diverse. Ciononostante, non si crea molta confusione perché tutte sono non ambigue.
La parola "esadecimale" è peculiare, perché il prefisso esa è derivato dal greco έξι (exi) (che significa sei), e decimale deriva dalla parola latina per dieci.

## Conversioni con altri sistemi numerici
### Sistema decimale

Per convertire un numero esadecimale in decimale si devono moltiplicare le sue cifre per le potenze della base 16 con esponente uguale alla loro posizione nel numero. Ad esempio 4F $=4\times 16^{1}+{\rm {F}}\times 16^{0}$ dove F vale 15 (vedi tabella sopra):
quindi $(4{\rm {{F})_{16}=4\times 16^{1}+15\times 16^{0}}}$. (Si ricordi che 16$^0$ = 1).
Allora $(4{\rm {{F})_{16}=4\times 16^{1}+15\times 1=4\times 16+15\times 1=64+15=79}}$.
L'operazione inversa — da decimale ad esadecimale — si realizza con una serie di divisioni successive. Si utilizza la divisione con resto. Vediamo un esempio:
${\frac {79}{16}}=4,9375$
Il risultato viene arrotondato per difetto. Occorre ora trovare il resto, moltiplicando la parte decimale per il divisore della precedente operazione: $0,9375\times 16=15$. Si deve comporre il numero in sistema esadecimale: il 4 è indicato dal simbolo $4$, il 15 dal simbolo $F$: $4F$.
Un altro esempio:
$FB3$ in esadecimale corrisponde al numero 4019 in base decimale. Si ha
$({\rm {FB}}3)_{16}=F\times 16^{2}+B\times 16^{1}+3\times 16^{0}=15\times 16^{2}+11\times 16^{1}+3\times 16^{0}=$
$=15\times 256+11\times 16+3\times 1=3840+176+3=4019.$
Viceversa, convertiamo $4019$ in esadecimale:
${\frac {4019}{16}}=251$ con resto 3.
Il quoziente 251 va di nuovo diviso per 16,
${\frac {251}{16}}=15$ con resto 11.
Il quoziente 15 è minore della base 16 e il procedimento di divisione si arresta.
Il numero viene quindi scritto con, in sequenza, l'ultimo quoziente ottenuto e la successione dei resti a ritroso. In questo caso la sequenza è $15$-$11$-$3$, cioè $F$-$B$-$3$.
che si scrive $FB3$.

### Sistema binario

Come già detto, la ragione per cui il sistema esadecimale si adopera in informatica è che può essere considerato come una scrittura più compatta del sistema binario, in quanto vi è corrispondenza biunivoca tra i numeri esadecimali di una cifra e quelli binari di quattro cifre. La conversione dalla base 16 alla base 2 e viceversa può quindi essere svolta per sostituzione di gruppi di cifre invece che con algoritmi di divisione.
Ad esempio, si consideri il seguente numero in base 16: $A16BC9_{16}$. Per convertirlo in base 2, è sufficiente prelevare ciascuna cifra esadecimale e sostituirla con il suo equivalente nel sistema binario, come riportato nella colonna a destra della tabella iniziale. Seguendo questa procedura, si perviene al seguente risultato:
| A16BC9$_{16}$ | = | A | 1 | 6 | B | C | 9$_{16}$ |
| | = | 1010 | 0001 | 0110 | 1011 | 1100 | 1001$_2$ |
| | = | 101000010110101111001001$_2$ | 101000010110101111001001$_2$ | 101000010110101111001001$_2$ | 101000010110101111001001$_2$ | 101000010110101111001001$_2$ |
Per ottenere la conversione opposta, invece, bisogna procedere nella maniera inversa: si suddivide il numero binario in gruppi di 4 cifre a partire da destra (se l'ultimo gruppo contiene meno di 4 cifre, vanno anteposti tanti zeri quanti servono per completarlo) e si sostituisce ogni gruppo con il suo equivalente esadecimale. Supponiamo ad esempio di convertire in base 16 il numero in base 2: 100101111111001011$_2$. Effettuando le operazioni descritte in precedenza si ha:
| 10 0101 1111 1100 1011$_2$ | = | 0010 | 0101 | 1111 | 1100 | 1011$_2$ |
| | = | 2 | 5 | F | C | B$_{16}$ |
| | = | 25FCB$_{16}$ | 25FCB$_{16}$ | 25FCB$_{16}$ | 25FCB$_{16}$ | 25FCB$_{16}$ |

## Frazioni

Il sistema esadecimale, come ogni sistema di numerazione posizionale, permette di rappresentare anche le frazioni, come numeri con la virgola: questi rappresentazioni possono essere limitate oppure illimitate periodiche, analogamente al caso decimale. Alcuni esempi:
| ${\frac {1}{2}}$ | = | 0,8: numero esadecimale limitato |
| ${\frac {1}{3}}$ | = | 0,555... = $0,{\overline {5}}$: numero esadecimale illimitato periodico |
| ${\frac {1}{4}}$ | = | 0,4 |
| ${\frac {1}{5}}$ | = | 0,333... = $0,{\overline {3}}$: periodico (semplice) |
| ${\frac {1}{6}}$ | = | 0,2AAA... = $0,2{\overline {A}}$: periodico (misto) |
| ${\frac {1}{8}}$ | = | 0,2 |
| ${\frac {1}{A}}$ | = | 0,1999... = $0,1{\overline {9}}$: periodico (misto) |
| ${\frac {1}{C}}$ | = | 0,1555... = $0,1{\overline {5}}$: periodico (misto) |
| ${\frac {1}{F}}$ | = | 0,111... = $0,{\overline {1}}$: periodico (semplice) |
Poiché la base 16 è una potenza di 2, hanno una rappresentazione limitata solo le frazioni che hanno, come denominatore, una potenza di 2. Infatti le cifre si ripetono quando il denominatore contiene un fattore primo che non si trova nella base. Nel caso dei numeri esadecimali, questo si verifica se e solo se il denominatore non è una potenza di due. Di conseguenza le frazioni esadecimali periodiche sono più frequenti che nel caso decimale (10 ammette come fattori primi 2 e 5).
I numeri irrazionali sono rappresentabili come numeri esadecimali illimitati aperiodici, esattamente come avviene nel caso decimale.
Infine, analogamente al caso del periodo 9 in base 10, si ha: $0,{\rm {\overline {F}}}=1$.