Convertitore di basi numeriche

Converte un numero tra binario, ottale, decimale, esadecimale e qualsiasi base da 2 a 36, con complemento a due e griglia di bit cliccabile.

Larghezza
Binario
Ottale
Decimale
Esadecimale
Base
Bit — clicca per invertire

larghezza 8 bit, 8 a uno

Cosa fa questo strumento

Lo stesso numero può essere scritto in molte basi, e i programmatori si spostano di continuo fra quattro di esse: binario perché è ciò che tiene l’hardware, esadecimale perché ne è un’abbreviazione leggibile, decimale perché è così che ragionano le persone, e ottale perché i permessi dei file e qualche sistema più datato lo usano ancora. Digita un valore in uno dei campi e gli altri seguono, insieme a un ulteriore campo impostabile su qualsiasi base da 2 a 36.

Ciò che lo distingue da una calcolatrice scolastica è il selettore di larghezza e la griglia di bit. Scegli 8, 16, 32 o 64 bit e i numeri negativi assumono la loro vera rappresentazione macchina invece di un segno meno, e ogni bit diventa qualcosa su cui puoi cliccare.

Cos’è davvero una base

Una base è quante cifre hai a disposizione prima di esaurirle e dover riportare. Il decimale ne ha dieci, quindi dopo il 9 viene il 10. Il binario ne ha due, quindi dopo l’1 viene il 10. La posizione di ogni cifra è una potenza della base, e tutto qui:

1011           # il numero, in base 2
1 x 8 = 8      # bit 3
0 x 4 = 0      # bit 2
1 x 2 = 2      # bit 1
1 x 1 = 1      # bit 0
8+0+2+1 = 11   # il totale, in decimale

Le basi sopra il dieci hanno bisogno di più di dieci simboli, e prendono quindi in prestito lettere: l’esadecimale va da 0-9 poi a-f, dove a vale 10 e f vale 15. Si prosegue fino alla base 36, che usa ogni cifra e ogni lettera — la base più grande scrivibile con l’alfabeto semplice, e il motivo per cui questo strumento si ferma lì.

Perché l’esadecimale, e non altro

L’esadecimale è diffuso per un motivo preciso: 16 è 2 elevato a 4, quindi esattamente una cifra hex copre esattamente quattro bit. Questo rende la conversione fra hex e binario una consultazione senza aritmetica — ogni cifra hex si espande nei suoi quattro bit, indipendentemente dalle cifre vicine.

d    e    a    d
1101 1110 1010 1101   # ogni cifra hex è un proprio nibble

L’ottale funziona allo stesso modo con tre bit per cifra, dato che 8 è 2 elevato a 3 — ed è per questo che i permessi Unix sono ottali: tre bit di permesso per gruppo di utenti entrano esattamente in una cifra. Il decimale non ha una relazione simile col binario, ed è per questo che convertire fra i due richiede una vera divisione anziché una consultazione.

È anche il motivo per cui qui il campo binario è raggruppato a quattro e quello hex a due: i gruppi coincidono con i confini che contano, così puoi leggere un nibble o un byte dallo schermo senza contare.

Numeri negativi e complemento a due

Un numero negativo non ha una forma binaria di per sé. In un registro non esiste il segno meno — solo bit — quindi il segno deve essere codificato nei bit stessi, e questo impone di decidere quanti bit ci sono. Ecco perché esiste il selettore di larghezza, ed ecco perché la risposta cambia quando lo cambi.

Lo schema che ogni macchina moderna usa è il complemento a due: per rappresentare un numero negativo si prende la sua forma positiva, si inverte ogni bit e si aggiunge uno. Il risultato è che il bit più alto finisce per significare «negativo», e l’addizione ordinaria continua a funzionare senza casi speciali per i segni.

0000 0101   # 5
1111 1010   # ogni bit invertito
1111 1011   # più uno: -5 come byte, o fb in hex

Allarga il registro e lo stesso numero riceve un motivo diverso: -5 è fb a 8 bit, fffb a 16 e fffffffb a 32. Il valore non è cambiato; è cambiato il numero di bit che lo portano. Cambiare larghezza in questo strumento mostra esattamente questo.

Perché 0xFF è insieme 255 e -1

I bit ff non dicono se sono con segno. Un byte che contiene 1111 1111 si legge 255 se il codice che lo carica ha dichiarato un tipo senza segno, e -1 se ne ha dichiarato uno con segno. Nulla nel byte stesso distingue i due casi — il tipo è un’affermazione che il programma fa su bit che non portano quell’informazione.

Da qui nasce un’intera famiglia di bug reali: un checksum che risulta negativo, un byte letto da un file che confronta come minore di zero, un char C che si comporta diversamente su ARM e su x86 perché la sua segnatura è definita dall’implementazione. Ogni volta che la lettura con segno e quella senza differiscono, questo strumento le mostra entrambe, perché la discrepanza è di solito proprio ciò che stavi cercando.

La griglia di bit

Ogni bit del valore corrente è mostrato con il suo numero di posizione, e cliccandolo si inverte. Le basi si aggiornano subito, il che rende alcune domande molto più facili che a mano:

  • Quale bit è attivo in questo valore di flag — cliccali e leggi le posizioni.
  • Qual è la maschera per i bit 4 e 7 — attiva quei due e leggi l’hex.
  • Cosa fa attivare il bit più alto a un valore con segno — lo rende negativo, in modo visibile.
  • Questo valore è una potenza di due — una potenza di due ha esattamente un bit attivo.

Il bit 0 è il meno significativo e sta a destra: è la convenzione universale e il motivo per cui la griglia resta da sinistra a destra anche su una pagina che si legge al contrario. Le righe sono di otto bit perché i confini dei byte si vedano a colpo d’occhio.

I numeri grandi restano esatti

I numeri JavaScript sono double, che tengono gli interi in modo esatto solo fino a 2^53 — circa 9 milioni di miliardi. Un valore a 64 bit può superarlo, e un convertitore costruito su numeri ordinari lo arrotonderà in silenzio, dando una stringa hex che sembra plausibile ed è sbagliata nelle ultime cifre.

Qui tutto usa interi a precisione arbitraria, quindi un valore a 64 bit completo si converte esattamente. La modalità a precisione arbitraria va oltre e rimuove del tutto il limite — utile per valori crittografici e identificatori grandi — ma nota che senza una larghezza fissa non c’è complemento a due, quindi in quella modalità un numero negativo porta semplicemente un segno meno in ogni base.

Domande frequenti

Perché -5 appare come fb invece di -101 in binario?
Perché un registro non ha un segno meno. Con una larghezza selezionata, i negativi sono mostrati in complemento a due, che è ciò che la macchina immagazzina davvero: -5 in un byte è 1111 1011, cioè fb. Se vuoi la forma matematica con il segno, porta la larghezza su precisione arbitraria.
0xFF è 255 o -1?
Entrambi — i bit sono identici e decide solo il tipo dichiarato. Un valore a 8 bit con segno legge ff come -1; uno senza segno lo legge 255. Ogni volta che le due letture differiscono, lo strumento le mostra affiancate.
Perché si usa così tanto l’esadecimale invece del decimale?
Perché una cifra hex è esattamente quattro bit, quindi hex e binario si convertono per consultazione senza aritmetica e le cifre si allineano ai confini dei byte. Il decimale non ha questa relazione col binario, perciò un valore decimale non dice nulla su quali bit siano attivi.
Qual è la base più alta qui, e perché 36?
36, perché sono 10 cifre più 26 lettere — ogni simbolo che l’alfabeto latino semplice offre. Andare oltre richiederebbe una convenzione su quali caratteri aggiuntivi usare, e non ce n’è una condivisa.
Posso incollare un valore con 0x o con spazi?
Sì. I prefissi 0x, 0b e 0o sono accettati nella base corrispondente, e spazi e trattini bassi vengono ignorati, così puoi incollare direttamente da codice o da un datasheet senza ripulire prima.
Un valore a 64 bit si converte esattamente?
Sì. Tutta l’aritmetica usa interi a precisione arbitraria, quindi i valori oltre 2^53 — dove un normale numero JavaScript comincia ad arrotondare — restano esatti.
Qualcosa di ciò che digito viene inviato a un server?
No. È aritmetica nel tuo browser; nulla viene caricato o registrato, e funziona senza connessione di rete.