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.

Largura
Binário
Octal
Decimal
Hexadecimal
Base
Bits — clique para inverter

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.