My Dev Tools
Conversores

Conversor de bases: binário, octal, decimal e hexadecimal

Digite ou cole um número inteiro (255, 0xFF, 0b1010, -0x1F) e veja em binário, octal, decimal, hexadecimal e na base que escolher, de 2 a 36, sem limite de 64 bits.Roda no seu navegador: nada é enviado
Aguardando um número inteiro.

Como usar

  1. Digite ou cole o número no painel Entrada do jeito que está no código ou no terminal: com sinal (-42), com prefixo (0x, 0b ou 0o) e com separadores (_, ' e espaço), que são ignorados. Ou toque em Exemplo.
  2. Em Base da entrada, deixe Auto (o prefixo diz a base; sem prefixo, é decimal) ou escolha uma base de 2 a 36 para ler dígitos sem prefixo, como FF ou 755.
  3. O Resultado mostra o número em 5 bases: binário, octal, decimal, hexadecimal e a Outra base, que você escolhe de 2 a 36. Cada linha tem o seu Copiar, e o Copiar do rodapé leva as 5, uma por linha.
  4. Ligue Prefixo, Agrupar e Maiúsculas para a saída ficar no formato do seu código: 0xDEAD_BEEF, 0b1111_0110 ou deadbeef.
  5. Em Complemento de dois, escolha a largura (Auto ou de 8 a 128 bits) para ver os bits, o padrão em hexadecimal e o valor sem sinal e com sinal; em Tamanho, veja os bits, os bytes, o menor tipo inteiro que guarda o número e se o Number do JavaScript o guarda exato. Suas escolhas ficam salvas neste navegador; o número, não.

Exemplos

O mesmo número em várias bases

entrada · Auto
0xDEAD_BEEF
saída
decimal 3735928559 · binário 11011110101011011011111011101111 · base 36 1PS9WXB

Negativo em complemento de dois

entrada
-10
Complemento de dois · Auto
em 8 bits: 1111_0110 (0xF6); sem sinal, 246

Inteiro grande sem arredondar

entrada
9007199254740993
Tamanho · Number do JavaScript
exato aqui; no Number do JavaScript vira 9007199254740992

Como a conversão funciona

Numa base b, cada dígito vale o seu valor vezes uma potência de b, que cresce da direita para a esquerda (1, b, b^2, b^3…). Em binário, 1010 = 8 + 2 = 10. O caminho inverso são as divisões sucessivas: divida o número pela base, guarde o resto e repita com o quociente até ele chegar a zero; os restos, lidos de baixo para cima, são os dígitos.

Hexadecimal e binário se convertem sem conta, porque 16 = 2^4: cada dígito hexadecimal vira exatamente 4 bits, e DE AD BE EF fica 1101 1110 1010 1101 1011 1110 1110 1111. No octal, 8 = 2^3, e cada dígito vira 3 bits. Por isso dump de memória e máscara de bits aparecem em hexadecimal: dois dígitos são um byte.

Da base 11 em diante faltam algarismos, e as letras entram no lugar: A vale 10, B vale 11 e assim até Z, que vale 35. Por isso a maior base é 36 = 10 + 26, os 10 algarismos e as 26 letras. A base 36 encurta IDs: 3735928559 vira 1PS9WXB. Já a “base 64” de e-mail e de data URL não é uma base numérica: é a codificação Base64, que transforma bytes em texto e tem a sua própria ferramenta.

Prefixos, separadores e o Auto

No Auto, 0x indica hexadecimal, 0b binário e 0o octal, em maiúscula ou minúscula, como no Python e no JavaScript; sem prefixo, o número é decimal. Com uma base escolhida, os dígitos são lidos nela, e o prefixo da mesma base pode ficar.

Os separadores do código são ignorados em qualquer ponto: o _ (1_000_000, como em Python, JavaScript, Java e Rust), o apóstrofo do C++ (1'000), espaços e quebras de linha. Também saem o n do BigInt no fim (255n, como o console.log mostra), as aspas do eco do REPL ('0xff') e a barra invertida no fim da linha, com que o bc quebra números longos. Espaços e quebras de linha juntam os dígitos num número só, com aviso: 10 20 vira 1020.

Cuidado com o zero à esquerda: em C, Java, PHP e no Bash, 0755 é octal e vale 493; o Python 3 recusa 0755 (pede 0o755), e o parseInt("0755") do JavaScript dá 755. Aqui, no Auto, 0755 é lido como decimal (755) com um aviso; para 493, escolha a base 8 ou escreva 0o755.

O que não é um número inteiro dá erro com a posição e o que fazer: 1.234 (ponto de milhar ou casa decimal), 1e3 (notação científica não entra: escreva 1000), # (cor CSS), \x41 (escape de byte), U+0041 (ponto de código Unicode), &HFF (Visual Basic) e FFh (sufixo do assembly). Nos cinco últimos, a mensagem diz como escrever em hexadecimal.

Negativos: sinal e magnitude e complemento de dois

Há dois jeitos de escrever um negativo em outra base. O primeiro é sinal e magnitude: o sinal na frente do valor absoluto, como fazem o (-10).toString(2) do JavaScript, que dá -1010, e o bin(-5) do Python, que dá -0b101. É o que as 5 linhas de base mostram.

O segundo é o complemento de dois, o jeito como o processador guarda inteiros com sinal numa largura fixa: o padrão de bits é o valor módulo 2 elevado à largura. -10 em 8 bits é 11110110 (F6, 246 sem sinal). Em outro exemplo, o byte FA (11111010) vale 250 sem sinal e -6 com sinal. É a conta do BigInt.asUintN e do BigInt.asIntN do JavaScript, e a seção Complemento de dois mostra as duas leituras, de 8 a 128 bits.

O Java não tem inteiro sem sinal e mostra o padrão de bits: Integer.toBinaryString(-5) devolve os 32 bits, 11111111111111111111111111111011, e Integer.parseUnsignedInt("DEADBEEF", 16) dá -559038737. Códigos de erro do Windows (HRESULT) aparecem dos dois jeitos: 0x80070005 é -2147024891 com sinal em 32 bits.

O DEC2HEX do Excel escreve negativos em 40 bits, com 10 dígitos hexadecimais: DEC2HEX(-1) dá FFFFFFFFFF. Este conversor não lê 40 bits, que não é uma das larguras daqui (8, 16, 32, 64 e 128): FFFFFFFFFF na base 16 vale 1099511627775, e o complemento de dois cai em 64 bits, com sinal positivo. Para ter o negativo, subtraia 2^40 (1.099.511.627.776): dá -1.

Números grandes: o limite do Number e o BigInt

O Number do JavaScript (e o double de outras linguagens) guarda inteiros exatos só até 2^53 - 1 = 9.007.199.254.740.991. Acima disso nem todo inteiro existe: parseInt("9007199254740993") e JSON.parse dão 9007199254740992, sem aviso, o que estraga IDs de banco e de redes sociais que chegam por JSON.

Aqui a conversão usa BigInt, que é exato em qualquer tamanho: um número de até 100.000 dígitos é convertido inteiro, e acima disso a leitura para com erro no primeiro dígito que passa. A tela mostra os primeiros 4.096 caracteres de cada base e diz quantos faltam; o Copiar leva o valor inteiro.

O Tamanho mostra quantos bits o número ocupa (sem o sinal, como o int.bit_length() do Python), os bytes, o menor tipo inteiro que o guarda (de uint8 e int8 a uint128 e int128) e se o Number do JavaScript o guarda exato.

Perguntas frequentes

Como converter binário em decimal à mão (e decimal em binário)?
Some as potências de 2 das posições com 1, da direita para a esquerda (1, 2, 4, 8…): 1010 = 8 + 2 = 10, e 11111111 = 255. No caminho inverso, divida por 2 e anote os restos até o quociente chegar a 0: 10 ÷ 2 = 5 resto 0; 5 ÷ 2 = 2 resto 1; 2 ÷ 2 = 1 resto 0; 1 ÷ 2 = 0 resto 1. Os restos de baixo para cima formam 1010.
Por que hexadecimal e binário se convertem de 4 em 4 bits?
Porque 16 = 2^4: cada dígito hexadecimal corresponde a exatamente 4 bits, de 0 (0000) a F (1111), e dá para converter dígito a dígito, sem conta: 0xF6 = 1111 0110. No octal, 8 = 2^3, e cada dígito vira 3 bits: 0o755 = 111 101 101, as permissões rwxr-xr-x do Unix.
O que significam 0x, 0b e 0o (e &H, h e #)?
São prefixos que dizem a base: 0x é hexadecimal (0xFF = 255), 0b é binário (0b1010 = 10) e 0o é octal (0o755 = 493), no Python, no JavaScript e em outras linguagens. Outras notações de hexadecimal dão erro aqui, e a mensagem diz como trocar: &H é o prefixo do Visual Basic (&HFF), o h no fim é o sufixo do assembly (FFh) e o # é de cor CSS. Para ler qualquer uma delas, troque pelo 0x ou escolha a base 16.
Como representar um número negativo em binário?
Em complemento de dois: escolha a largura, escreva o valor absoluto em binário, inverta todos os bits e some 1. Para -6 em 8 bits: 6 = 00000110, invertido 11111001, mais 1 = 11111010, que é FA em hexadecimal. O mesmo byte FA lido sem sinal vale 250 (256 - 6). Linguagens que mostram sinal e magnitude escrevem -110.
Por que parseInt("9007199254740993") dá 9007199254740992?
Porque o resultado é um Number, ponto flutuante de 64 bits (IEEE 754) com 53 bits de precisão: acima de 2^53 - 1 = 9.007.199.254.740.991 ele só representa inteiros pares, e 9007199254740993 é arredondado para o vizinho 9007199254740992. O JSON.parse faz o mesmo com IDs grandes. Para guardar exato, use BigInt (9007199254740993n) ou mantenha o número como texto; aqui ele é convertido exato.
Dá para converter número com vírgula?
Não: o conversor lê só números inteiros, e a vírgula ou o ponto dão erro com a dica. Em binário, a maioria das frações não é exata: 0,1 em binário é a dízima 0,0001100110011…, que se repete para sempre, e por isso 0,1 + 0,2 não dá 0,3 em ponto flutuante. Notação científica (1e3) e vários números de uma vez também não são lidos: os espaços juntam os dígitos num número só.

Ferramentas relacionadas

  • Cole texto ou Base64: o sentido é detectado sozinho, acentos e emoji saem certos e o erro mostra a posição exata.

  • Digite um texto ou abra um arquivo: os sete hashes aparecem juntos, em hex ou Base64, e você confere com o hash esperado. Tudo no navegador.

Atualizado em .