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.
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?
| Parâmetro | Tipo | Padrão | Comportamento e casos-limite |
|---|---|---|---|
| Faixa de base | 2 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ão | arbitrária | BigInt | Inteiros 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ções | multiplicação repetida | 40 dígitos no máximo | Exato 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ço | aceitos | 1010_1010 e 1010 1010 ambos são analisados. Rejeitá-los seria pedantismo; é assim que as pessoas escrevem um byte. |
| Prefixos | 0b 0o 0x | verificados | Aceitos 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. |
| Agrupamento | booleano | on | A 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 dois | 8/16/32/64-bit | ajuste mais estreito | Como um valor negativo é realmente armazenado, que é por que -1 aparece como ffffffff em um depurador. |
| Largura de bit | com e sem sinal | informada | Qual 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.