Pular para o conteúdo principal

Converter base numérica

O Conversor de base numérica converte entre binário, octal, decimal, hexadecimal e qualquer base de 2 a 36, no seu navegador. Os inteiros passam por BigInt de ponta a ponta em vez de passar por um double, porque parseInt retorna silenciosamente 9007199254740992 para 9007199254740993 — e os valores que as pessoas convertem são IDs, bitmasks e hashes, exatamente o material que excede esse limite.

Só local

Digite um número acima ou teste um exemplo para converter entre bases binária, decimal, hexadecimal e outras.

Como funciona o Converter base numérica?

Conversão de base parece uma linha de código e deixa de ser em dois pontos: inteiros grandes e frações.

parseInt perde dígitos, silenciosamente

parseInt("9007199254740993", 10) retorna 9007199254740992. Nada lança erro, nada avisa, e o último dígito simplesmente desaparece — porque um número JavaScript é um double e 2 53 é onde inteiros consecutivos deixam de ser representáveis. O que as pessoas convertem entre bases são snowflake IDs, bitmasks de permissões, hashes e endereços de memória, e todos eles rotineiramente excedem isso. Por isso, o caminho de inteiros aqui é BigInt do parse à formatação, sem nunca fazer round-trip por um double.

Frações são convertidas por multiplicação repetida

BigInt não tem parte fracionária, então a fração é tratada separadamente: multiplique os dígitos fracionários pela base de destino, tome o carry como o próximo dígito de saída, repita. Toda a aritmética fica em inteiros na base de origem, então nada passa por um float — e é por isso que 0.1 na base 3 sai exatamente como 0.1 aqui, em vez de 0.3333333333333333.

Algumas frações não terminam na base de destino: 0.1 decimal é 0.0001100110011… em binário, repetindo para sempre, o mesmo fato por trás de 0.1 + 0.2 !== 0.3. Nada pode corrigir isso, então a expansão é limitada a quarenta dígitos e para.

Um 0x inicial que contradiz a base é um erro

Colar 0x1f com a base 10 selecionada quase certamente significa que você quis dizer a base 16. Tratar 0 e x como dígitos ou falharia de forma confusa ou produziria uma resposta errada, então a divergência é apontada explicitamente. Separadores de dígitos — underscores e espaços — são aceitos, porque 1010_1010 é como as pessoas realmente escrevem um byte.

O complemento de dois é o motivo de -1 aparecer como ffffffff

Um inteiro negativo na memória é armazenado como o seu complemento de dois: inverta os bits e some um. Então -1 em 32 bits é ffffffff, e -2147483648 é 80000000. Quando um debugger mostra um valor hexadecimal positivo enorme onde você esperava um negativo pequeno, foi isso que aconteceu. O painel mostra a codificação na menor largura que comporta o valor.

Bits ligados, para um valor usado como máscara

Um inteiro de permissões é um conjunto de flags, e a pergunta útil é quais estão ligados. As posições dos bits são listadas contando a partir do zero no bit menos significativo, que é a convenção que toda operação de deslocamento de bits usa.

Entrada

255 (base 10)

Convertido

binary       1111 1111
octal        377
hexadecimal  ff
set bits     0, 1, 2, 3, 4, 5, 6, 7

Quais opções e casos-limite o Converter base numérica suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
Faixa de base2 a 36—Os dígitos são 0–9 depois a–z, sem distinção entre maiúsculas e minúsculas, o que dá 36 símbolos. A base 36 é a codificação mais densa que usa apenas alfanuméricos.
PrecisãoarbitráriaBigIntInteiros de qualquer comprimento convertem exatamente. parseInt perde dígitos além de 2^53 sem aviso, que é o bug mais comum em conversores de base.
Fraçõesmultiplicação repetida40 dígitos no máximoExato quando a fração termina na base de destino. Quando não termina — 0.1 decimal em binário — a expansão é limitada em vez de infinita.
Separadores_ e espaçoaceitos1010_1010 e 1010 1010 ambos são analisados. Rejeitá-los seria pedantismo; é assim que as pessoas escrevem um byte.
Prefixos0b 0o 0xverificadosAceitos quando concordam com a base selecionada, e reportados como erro quando não concordam — colar 0x1f com base 10 selecionada é um erro digno de nomear.
AgrupamentobooleanoonA cada 4 dígitos em binário, 3 em octal e decimal, 2 em hexadecimal — os agrupamentos que correspondem a como cada base é lida.
Complemento de dois8/16/32/64-bitajuste mais estreitoComo um valor negativo é realmente armazenado, que é por que -1 aparece como ffffffff em um depurador.
Largura de bitcom e sem sinalinformadaQual dos int8 até uint64 pode conter o valor. Um valor que cabe em int32 mas não em int16 é o tipo de coisa que vale a saber antes de escolher um tipo de coluna.

Perguntas frequentes

Por que outros conversores me dão uma resposta diferente para um número longo?

Porque usam parseInt ou Number, que passam por um double e perdem precisão além de 2^53 — cerca de 9,007 quatrilhões. parseInt("9007199254740993") retorna 9007199254740992, sem erro. Esta ferramenta usa BigInt em tudo, então cada dígito sobrevive. Se você está convertendo um snowflake ID, um hash ou um bitmask grande, é essa a diferença que importa.

Por que 0.1 não converte de forma limpa para binário?

Porque não consegue. Um décimo é 0.0001100110011… na base 2, repetindo para sempre, pelo mesmo motivo pelo qual um terço é 0.333… na base 10: o denominador tem um fator primo que a base não tem. Esta é a explicação completa para 0.1 + 0.2 !== 0.3 em toda linguagem com ponto flutuante binário. A expansão aqui para em quarenta dígitos porque precisa parar em algum lugar.

Por que -1 aparece como ffffffff?

Isso é o complemento de dois, que é como essencialmente todo computador armazena um inteiro negativo: inverta os bits da magnitude e some um. Tem a propriedade agradável de a adição funcionar identicamente para valores com e sem sinal, e é por isso que venceu as alternativas. Quando um debugger mostra um valor hex positivo suspeitosamente grande onde você esperava um número negativo pequeno, é isso que você está vendo.

Para que serve a base 36?

Identificadores compactos. A base 36 usa 0-9 e a-z, que é o maior alfabeto que sobrevive à conversão de caixa, à digitação por um humano e ao uso em uma URL sem codificação. Um timestamp na base 36 tem cerca de metade do comprimento que tem em decimal. A base 62 é mais densa, mas diferencia maiúsculas de minúsculas, o que a torna frágil em qualquer lugar que converta para minúsculas.

Dá para converter o padrão de bits de um número de ponto flutuante?

Não diretamente — isto converte o valor matemático, não a codificação IEEE 754. São questões diferentes: 0.5 como valor é 0.1 em binário, enquanto 0.5 como double é 3FE0000000000000 em hex. Se você quer o padrão de bits, converta o hex da forma codificada como um inteiro.

O meu número é enviado?

Não. É aritmética, executada no seu navegador. Nada em converter 255 para hexadecimal exige um servidor, e os números que as pessoas convertem frequentemente são identificadores internos que elas prefeririam não entregar ao log de outra pessoa.