Convertitore da esadecimale a decimale
Risultato
Decimale
- Valori posizionali
- 2×4096 + 10×256 + 3×16 + 15
Un convertitore da esadecimale a decimale riscrive un numero nella base in cui la gente conta, e mostra da dove viene la risposta. La conversione si fa sommando: ogni carattere viene letto come valore numerico, moltiplicato per la potenza di sedici della sua posizione e sommato agli altri. I caratteri da A a F vanno sostituiti prima di moltiplicare, quindi A vale dieci e F vale quindici, e il momento in cui si sbaglia è proprio questo: leggere la A come uno cambia il risultato di un fattore dieci. La potenza di sedici di una posizione cresce molto in fretta, molto più delle potenze di due o di dieci: uno, sedici, 256, 4096, 65.536, 1.048.576, e già alla sesta posizione si supera il milione. È per questo che una scrittura esadecimale è così corta rispetto al numero che rappresenta, ed è anche il motivo per cui la somma stampata accanto al risultato è la parte più utile della pagina: rende verificabile a colpo d'occhio un valore che altrimenti andrebbe creduto sulla parola. L'ultima posizione a destra vale uno, quella accanto sedici, e ogni passo verso sinistra moltiplica di nuovo per sedici. Maiuscole e minuscole sono equivalenti, gli zeri iniziali non cambiano il valore e un segno meno si limita a portare il segno fuori dalla somma.
Le potenze di sedici, dalla posizione più a destra fino a quella più ampia che un ingresso accettato può raggiungere
| Posizione | Potenza | Valore |
|---|---|---|
| 13 | 16¹³ | 4503599627370496 |
| 12 | 16¹² | 281474976710656 |
| 11 | 16¹¹ | 17592186044416 |
| 10 | 16¹⁰ | 1099511627776 |
| 9 | 16⁹ | 68719476736 |
| 8 | 16⁸ | 4294967296 |
| 7 | 16⁷ | 268435456 |
| 6 | 16⁶ | 16777216 |
| 5 | 16⁵ | 1048576 |
| 4 | 16⁴ | 65536 |
| 3 | 16³ | 4096 |
| 2 | 16² | 256 |
| 1 | 16¹ | 16 |
| 0 | 16⁰ | 1 |
Quattordici righe, da 16⁰ fino a 16¹³, e la lunghezza non è arbitraria: quattordici caratteri è l'ingresso più largo che questa famiglia accetta, quindi la tabella copre ogni posizione che una risposta può usare e si ferma. Leggerla verso il basso è leggere le posizioni della risposta da destra a sinistra: l'ultima riga è il carattere più a destra e la prima è quello più a sinistra. La colonna centrale è la posizione scritta come potenza, che è ciò per cui moltiplica la somma nel pannello qui sopra; la terza colonna è quella potenza calcolata, che è ciò per cui si moltiplica in pratica. Questi valori si incrociano con le pagine del binario: 16 è 2⁴, 256 è 2⁸ e 65.536 è 2¹⁶, perché una cifra esadecimale contiene quattro bit. Quindi la stessa tabella risponde a quanto vale un gruppo di quattro bit quando viene letto come numero invece che come bit. È fissa e non segue quello che hai digitato.
Formula
2A3F = 2×16³ + 10×16² + 3×16¹ + 15×16⁰ = 2×4096 + 10×256 + 3×16 + 15 = 10815
- 2A3F
- Il numero esadecimale da convertire. Le lettere sono indifferenti alla distinzione fra maiuscole e minuscole, quindi 2a3f e 2A3F sono lo stesso valore; uno zero in testa non cambia niente e un segno meno iniziale dà un risultato negativo
- 16ⁿ
- La potenza di sedici agganciata a una posizione, contata da zero a partire dal carattere più a destra. Il più a destra vale 16⁰, cioè uno; quello accanto vale 16¹, cioè sedici; e ogni passo verso sinistra moltiplica di nuovo per sedici
- 2, 10, 3, 15
- I caratteri letti come valori, con le lettere già sostituite: A diventa dieci e F diventa quindici prima che venga fatta qualsiasi moltiplicazione. Leggere A come uno è l'errore che questa riga esiste per prevenire, ed è il modo più comune in cui questa conversione va storta
- 2×4096
- Un termine della somma: il valore del carattere moltiplicato per la potenza della sua posizione. Ogni carattere contribuisce con un termine, compresi quelli che valgono zero, con la differenza che un termine nullo non cambia niente e nella somma stampata viene semplicemente lasciato fuori
- = 10815
- Il totale dei termini, cioè 10.815 nella scrittura italiana. È un numero decimale e non una sequenza di cifre in un'altra base, ed è per questo che il risultato di questa pagina si può usare direttamente in ulteriori calcoli
- 14 caratteri
- L'ingresso più largo accettato, che è 1FFFFFFFFFFFFF. Quattordici caratteri è la lunghezza alla quale il valore arriva a 9.007.199.254.740.991, oltre la quale una macchina non riesce più a tenere separati numeri interi vicini, quindi un ingresso più lungo viene rifiutato invece di essere convertito
Questa conversione serve ogni volta che un valore scritto in esadecimale va confrontato con qualcosa che non lo è. Gli usi concreti sono il confronto di un indirizzo o di un offset con un numero letto altrove, il passaggio di un valore da un documento tecnico a un modulo che accetta solo cifre decimali, e la lettura di un codice di errore o di stato che è documentato in esadecimale ma va riferito a una quantità. Un caso frequente è la verifica incrociata: un valore che il debugger mostra in esadecimale e che il codice descrive in decimale, dove la conversione è l'unico modo di sapere se le due cose parlano dello stesso numero. Il secondo uso è il controllo di una conversione fatta nell'altro senso: chi ha appena scritto un numero in esadecimale usando l'altra pagina di questa famiglia può convertirlo qui e verificare che ridia il numero di partenza, ed è un controllo che non richiede di rifare il lavoro. Il terzo è capire l'ordine di grandezza di un valore esadecimale senza eseguire la conversione per intero: le potenze di sedici crescono così rapidamente che il numero di caratteri dice subito in che intervallo si sta, e la tabella qui sotto è il posto in cui questa scala è scritta per esteso.
Esempi svolti
Lettura di 2A3F
- I quattro caratteri occupano le posizioni 3, 2, 1 e 0, contate da destra
- I pesi sono 16³ = 4096, 16² = 256, 16¹ = 16 e 16⁰ = 1
- Sostituendo le lettere: 2, 10, 3, 15
- Moltiplicando: 2×4096, 10×256, 3×16, 15×1
- Sommando: 8192 + 2560 + 48 + 15 = 10.815
Il termine che vale la pena guardare è il secondo, 10×256: la A è diventata dieci prima di essere moltiplicata, e se fosse rimasta una lettera o fosse stata letta come uno l'intera somma sarebbe stata diversa. I quattro pesi crescono di sedici volte a ogni passo, ed è per questo che il primo carattere pesa più di tutti gli altri messi insieme: 4096 contro 2623. La somma stampata accanto alla risposta è ciò che rende il risultato verificabile, perché il valore decimale da solo non dice niente su come sia stato ottenuto.
Un byte intero, FF
- Due caratteri, quindi le posizioni sono la 1 e la 0
- I pesi sono 16¹ = 16 e 16⁰ = 1
- La F vale quindici in entrambe le posizioni
- 15×16 + 15 = 240 + 15 = 255
FF è il valore più grande che sta in un byte, e il fatto che due cifre esadecimali coprano esattamente l'intervallo di un byte è la ragione per cui l'esadecimale si usa per tutto ciò che è fatto di ottetti. Il conto si può fare a mente in un caso come questo: due caratteri uguali al massimo danno sedici al quadrato meno uno, cioè 256 meno uno. Riconoscere a vista che due F fanno 255, che tre F fanno 4095 e che quattro F fanno 65.535 è utile perché questi valori ricorrono continuamente in maschere, indirizzi e campi di protocollo.
Lettura di B2
- Due caratteri, quindi le posizioni sono la 1 e la 0
- La B vale undici e il 2 vale due
- 11×16 + 2 = 176 + 2 = 178
- La somma stampata è 11×16 + 2, con la lettera già sostituita
Questo è lo stesso valore della pagina binaria, dove 10110010 si legge 128 + 32 + 16 + 2 = 178: le due strade passano da basi diverse e arrivano allo stesso numero, che è la prova che la notazione è una scrittura e non una proprietà. La coincidenza fra i due percorsi è anche il modo più rapido di controllare una conversione esadecimale, se si sa già leggere il binario: due caratteri esadecimali sono otto bit, e gli otto bit si sommano con le potenze di due. Il termine 11×16 è quello che porta il valore della lettera, e la lettera è già stata sostituita prima della moltiplicazione.
L'ingresso più grande, 1FFFFFFFFFFFFF
- Quattordici caratteri, quindi le posizioni vanno da 13 a 0
- Il primo carattere è 1 e pesa 16¹³, cioè 4.503.599.627.370.496
- Gli altri tredici caratteri sono tutti F e valgono quindi tutti quindici
- La somma ha quattordici termini, e il primo da solo vale più della metà del totale
- Il totale è 9.007.199.254.740.991, che è il numero intero più grande rappresentabile in modo esatto in doppia precisione
L'ultimo esempio mostra perché la lunghezza dell'ingresso è limitata a quattordici caratteri: il valore che ne esce è 9.007.199.254.740.991, cioè due elevato alla cinquantatreesima meno uno, il numero intero più grande che una macchina riesce a tenere distinto dai suoi vicini in doppia precisione. Un carattere in più porterebbe a un valore che non è più rappresentabile in modo esatto, e la risposta sembrerebbe un numero senza esserlo. La somma stampata ha quattordici termini e il primo da solo supera la metà del totale, che è l'altra cosa da notare: in questa base la cifra più a sinistra pesa più di tutte quelle a destra messe insieme.
Limiti
Il convertitore accetta un segno meno opzionale e una sequenza di caratteri da 0 a 9 e da A a F, indifferentemente in maiuscolo o in minuscolo, e non accetta altro: niente spazi, niente prefissi come 0x, niente punto per una parte frazionaria e nessun separatore di migliaia. La risposta è un numero decimale intero, quindi non esiste qui nessun valore frazionario da convertire. Gli ingressi sono limitati a quattordici caratteri, cioè 1FFFFFFFFFFFFF, che in decimale è 9.007.199.254.740.991; oltre quella lunghezza i numeri interi vicini non sono più distinguibili e il risultato sembrerebbe un numero senza esserlo, quindi un ingresso più lungo viene rifiutato con un messaggio invece di ricevere una risposta approssimata. La somma stampata lascia fuori i termini nulli, quindi il numero di addendi visibili è minore del numero di caratteri ogni volta che nell'ingresso compare uno zero: l'assenza di un termine è significativa quanto la sua presenza. La tabella delle potenze si ferma a quattordici righe, che è la lunghezza massima dell'ingresso e non un limite della conversione, la quale funzionerebbe identica su potenze più alte. La pagina non gestisce il complemento a due, quindi una sequenza di F che in un registro rappresenterebbe un numero negativo qui viene letta come il valore positivo che le sue cifre compongono, e non c'è modo di chiedere una lettura diversa. Infine non spiega che cosa sia una cifra esadecimale in sé: dà per scontata la sostituzione delle lettere, che la tabella qui sotto rende esplicita.
Domande frequenti
- Perché si moltiplica per 16 e non si somma semplicemente?
- Perché le cifre pesano in modo diverso secondo la posizione che occupano, quindi non sono addendi intercambiabili: in 2A3F il 2 vale 8192 e la F vale 15. Moltiplicare ogni carattere per la potenza della sua posizione è il modo di tradurre quella differenza in un numero. In decimale il meccanismo è identico e passa inosservato solo perché i pesi — uno, dieci, cento — sono quelli che si imparano a scuola, mentre le potenze di sedici crescono così in fretta che vale la pena guardare la tabella invece di calcolarle a mente.
- Cosa devo fare con le lettere prima di moltiplicare?
- Sostituirle con i valori numerici corrispondenti: A vale dieci, B undici, C dodici, D tredici, E quattordici e F quindici. La sostituzione va fatta prima della moltiplicazione, ed è il passaggio in cui si concentrano gli errori di questa conversione. Leggere la A come uno è il caso peggiore, perché la moltiplicazione riesce comunque e il termine che ne esce non è palesemente sbagliato: 1×4096 al posto di 2×4096 produce una somma più piccola e del tutto plausibile. La somma stampata accanto al risultato è il posto in cui questo errore si vede, perché lì i caratteri sono già stati sostituiti.
- Perché i pesi crescono così in fretta?
- Perché ogni passo verso sinistra moltiplica per sedici, e sedici è già una quantità grande di partenza. I primi pesi sono uno, sedici, 256, 4096, 65.536, 1.048.576, e alla sesta posizione si è già superato il milione. È questa crescita rapida la ragione per cui l'esadecimale è così compatto: un valore che in decimale richiede sette cifre ne richiede cinque in esadecimale, e uno che ne richiede sedici ne richiede quattordici. È anche la ragione per cui la cifra più a sinistra pesa più di tutte quelle a destra messe insieme, e la si vede all'opera nell'ultimo esempio della pagina.
- Come faccio a controllare che la risposta sia giusta?
- Con la somma stampata accanto al risultato, che è il controllo più diretto: i termini sono già nell'ordine delle posizioni e con le lettere sostituite, quindi basta rifare le moltiplicazioni e l'addizione. Un secondo controllo, utile quando si conosce il binario, è convertire a mente i due caratteri in otto bit e sommare le potenze di due: B2 diventa 1011 0010 e quindi 128 + 32 + 16 + 2 = 178, che è lo stesso valore che dà la somma in base sedici. Il fatto che due strade diverse arrivino allo stesso numero è la prova che la conversione è stata fatta bene.
- Gli zeri all'inizio del numero contano qualcosa?
- No. Gli zeri iniziali dicono quanto è largo il campo e non quanto vale il numero: 02A3F e 2A3F sono lo stesso valore e danno la stessa risposta. Il caso si incontra spesso quando i valori arrivano da registri, file di configurazione o campi a larghezza fissa, dove lo zero in testa fa parte della rappresentazione. Attenzione però a non confonderli con i termini nulli della somma: uno zero in testa è una posizione che non esiste nel numero, mentre uno zero in mezzo è una posizione che esiste e che semplicemente non contribuisce al totale. Gli uni non compaiono nella somma, gli altri sì, come assenza di un termine.
- Posso convertire un numero con la virgola?
- No, questa pagina lavora su numeri interi e un punto o una virgola nell'ingresso vengono segnalati come errore. La parte frazionaria esiste anche in base sedici — le cifre a destra della virgola valgono un sedicesimo, un duecentocinquantaseiesimo e così via — ma segue un procedimento diverso, con moltiplicazioni successive invece di potenze negative, e un convertitore che la ignorasse in silenzio restituirebbe un numero diverso da quello digitato senza dirlo. Il segno meno invece è accettato, e resta davanti al risultato senza partecipare alla somma.
Riferimenti
- Hexadecimal — base sixteen, the letters A to F as the values ten to fifteen, and conversion to and from decimal — Wolfram MathWorld (United States)
- Number base — why a numeral's value depends on its position and on the base, and how the same quantity is written in several bases — Wolfram MathWorld (United States)
- IEEE 754 — the double-precision format these calculations are carried out in, and the 53-bit significand that fixes this page's input ceiling — IEEE Standards Association (United States)
- Esadecimale — la numerazione in base sedici e il valore che una cifra assume secondo la posizione che occupa — Treccani, Istituto della Enciclopedia Italiana (Italia)