Conversor de bases numéricas
Converte um número entre binário, octal, decimal, hexadecimal e qualquer base de 2 a 36, com complemento de dois de largura fixa e uma grelha de bits clicável.
8 bits de largura, 8 ligados
O que esta ferramenta faz
O mesmo número pode ser escrito em muitas bases, e os programadores movem-se entre quatro delas constantemente: binário porque é o que o hardware guarda, hexadecimal porque é uma abreviatura legível dele, decimal porque é assim que as pessoas pensam, e octal porque as permissões de ficheiros e alguns sistemas mais antigos ainda o usam. Escreva um valor em qualquer dos campos e os restantes acompanham, além de mais um campo que pode fixar em qualquer base de 2 a 36.
O que o separa de uma calculadora escolar é o seletor de largura e a grelha de bits. Escolha 8, 16, 32 ou 64 bits e os números negativos assumem a sua representação real na máquina em vez de um sinal de menos, e cada bit passa a ser algo em que pode clicar.
O que é realmente uma base
Uma base é quantos dígitos tem antes de os esgotar e ter de transportar. O decimal tem dez, por isso depois do 9 vem o 10. O binário tem dois, por isso depois do 1 vem o 10. A posição de cada dígito é uma potência da base, e é tudo:
1011 # o número, em 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 # o total, em decimal
As bases acima de dez precisam de mais de dez símbolos, por isso pedem emprestadas letras: o hexadecimal vai de 0-9 e depois a-f, em que a é 10 e f é 15. Isso continua até à base 36, que usa todos os dígitos e todas as letras — a maior base que se pode escrever com o alfabeto simples, e a razão por que esta ferramenta para aí.
Porquê hexadecimal, e não outra coisa
O hex é popular por uma razão concreta: 16 é 2 elevado a 4, por isso exatamente um dígito hex cobre exatamente quatro bits. Isso torna a conversão entre hex e binário uma consulta sem aritmética — cada dígito hex expande-se nos seus quatro bits, independentemente dos dígitos à volta.
d e a d 1101 1110 1010 1101 # cada dígito hex é o seu próprio nibble
O octal funciona da mesma maneira com três bits por dígito, já que 8 é 2 elevado a 3 — e é por isso que as permissões Unix são octais: três bits de permissão por grupo de utilizadores cabem exatamente num dígito. O decimal não tem essa relação com o binário, e por isso converter entre eles exige divisão a sério em vez de uma consulta.
É também por isso que aqui o campo binário é agrupado de quatro em quatro e o hex de dois em dois: os grupos coincidem com as fronteiras que importam, por isso pode ler um nibble ou um byte no ecrã sem contar.
Números negativos e complemento de dois
Um número negativo não tem forma binária por si só. Não há sinal de menos num registo — só bits — por isso o sinal tem de ser codificado nos próprios bits, e isso obriga a decidir quantos bits há. É por isso que o seletor de largura existe, e por isso a resposta muda quando o altera.
O esquema que todas as máquinas modernas usam é o complemento de dois: para representar um número negativo, toma-se a sua forma positiva, inverte-se cada bit e soma-se um. O resultado é que o bit de topo acaba a significar «negativo», e a adição comum continua a funcionar sem qualquer caso especial para os sinais.
0000 0101 # 5 1111 1010 # cada bit invertido 1111 1011 # mais um: -5 como byte, ou fb em hex
Alargue o registo e o mesmo número recebe outro padrão: -5 é fb em 8 bits, fffb em 16 e fffffffb em 32. O valor não mudou; mudou o número de bits que o transportam. Mudar de largura nesta ferramenta mostra exatamente isso.
Porque 0xFF é ao mesmo tempo 255 e -1
Os bits ff não dizem se têm sinal. Um byte com 1111 1111 lê-se como 255 se o código que o carrega declarou um tipo sem sinal, e como -1 se declarou um com sinal. Nada no byte em si distingue os dois — o tipo é uma afirmação que o programa faz sobre bits que não transportam essa informação.
Daí nasce toda uma família de erros reais: uma soma de verificação que sai negativa, um byte lido de um ficheiro que compara como menor que zero, um char de C que se comporta de forma diferente em ARM e em x86 porque o seu sinal é definido pela implementação. Sempre que as leituras com e sem sinal diferem, esta ferramenta mostra ambas, porque a discrepância é normalmente aquilo que procurava.
A grelha de bits
Cada bit do valor atual é mostrado com o seu número de posição, e clicar num deles inverte-o. As bases atualizam-se de imediato, o que torna algumas perguntas bem mais fáceis do que à mão:
- Que bit está ligado neste valor de flags — clique neles e leia as posições.
- Qual é a máscara para os bits 4 e 7 — ligue esses dois e leia o hex.
- O que faz ligar o bit de topo a um valor com sinal — torna-o negativo, à vista.
- Este valor é uma potência de dois — uma potência de dois tem exatamente um bit ligado.
O bit 0 é o menos significativo e fica à direita, o que é a convenção universal e a razão por que a grelha se mantém da esquerda para a direita mesmo numa página que se lê ao contrário. As linhas têm oito bits para que as fronteiras de byte se vejam num relance.
Os números grandes mantêm-se exatos
Os números de JavaScript são doubles, que guardam inteiros de forma exata apenas até 2^53 — cerca de 9 mil biliões. Um valor de 64 bits pode ultrapassá-lo, e um conversor construído sobre números comuns arredonda-o em silêncio, dando uma cadeia hex que parece plausível e está errada nos últimos dígitos.
Aqui tudo usa inteiros de precisão arbitrária, por isso um valor completo de 64 bits converte-se exatamente. O modo de precisão arbitrária vai mais longe e remove o limite por completo — útil para valores criptográficos e identificadores grandes — mas note que sem uma largura fixa não há complemento de dois, pelo que um número negativo nesse modo leva simplesmente um sinal de menos em cada base.
Perguntas frequentes
- Porque é que -5 aparece como fb em vez de -101 em binário?
- Porque um registo não tem sinal de menos. Com uma largura selecionada, os negativos são mostrados em complemento de dois, que é o que a máquina guarda de facto: -5 num byte é 1111 1011, ou fb. Se quiser a forma matemática com sinal, mude a largura para precisão arbitrária.
- 0xFF é 255 ou -1?
- Ambos — os bits são idênticos e só o tipo declarado decide. Um valor de 8 bits com sinal lê ff como -1; um sem sinal lê-o como 255. Sempre que as duas leituras diferem, a ferramenta mostra-as lado a lado.
- Porque é que se usa tanto o hexadecimal em vez do decimal?
- Porque um dígito hex são exatamente quatro bits, por isso hex e binário convertem-se por consulta sem aritmética e os dígitos alinham com as fronteiras de byte. O decimal não tem essa relação com o binário, pelo que um valor decimal não lhe diz nada sobre que bits estão ligados.
- Qual é a base mais alta aqui, e porquê 36?
- 36, porque são 10 dígitos mais 26 letras — todos os símbolos que o alfabeto latino simples oferece. Ir mais alto exigiria uma convenção sobre que caracteres adicionais usar, e não há nenhuma consensual.
- Posso colar um valor com 0x ou com espaços?
- Sim. Os prefixos 0x, 0b e 0o são aceites na base correspondente, e espaços e sublinhados são ignorados, por isso pode colar diretamente de código ou de uma ficha técnica sem limpar primeiro.
- Um valor de 64 bits converte-se exatamente?
- Sim. Toda a aritmética usa inteiros de precisão arbitrária, por isso os valores acima de 2^53 — onde um número normal de JavaScript começa a arredondar — mantêm-se exatos.
- Algo do que escrevo é enviado para um servidor?
- Não. É aritmética no seu navegador; nada é carregado nem registado, e funciona sem ligação à rede.