Calculadora de complemento de dois (conversão binária de inteiros com sinal)
Converte um inteiro decimal com sinal para seu padrão binário em complemento de dois de 8/16/32/64 bits, ou realiza a conversão inversa. Também mostra a interpretação sem sinal, a notação hexadecimal e detecta valores fora do intervalo.
Dicas
- Um inteiro com sinal de 8 bits vai de -128 a 127. Experimente digitar 127 e depois 128 para ver o limite do overflow em ação: 128 não cabe e dispara o erro de intervalo, exatamente onde ocorreria a virada para -128.
- A linha "decimal sem sinal" lê o mesmo padrão de bits sem tratar o bit mais significativo como sinal. Compará-la com a linha com sinal torna a diferença entre as duas interpretações imediatamente visível.
- Uma entrada binária deve ter exatamente tantos dígitos quanto a largura de bits selecionada: 8 dígitos para 8 bits, 16 para 16 bits, e assim por diante.
- Os cálculos de 64 bits usam BigInt internamente em vez do tipo Number do JavaScript, então valores próximos de 2^63 são convertidos sem perda de precisão.
- Esta ferramenta também é útil para entender o comportamento de overflow de inteiros em linguagens como C e Java, onde os tipos int (32 bits) e long (64 bits) dão a volta exatamente nesses mesmos limites.
Perguntas frequentes
Curiosidade — Por que os computadores usam complemento de dois
O complemento de dois não é a única forma de representar números negativos em binário. Historicamente também foram usadas a representação de sinal e magnitude (usando o bit mais significativo apenas como indicador de sinal) e o complemento de um (simplesmente invertendo os bits de um número positivo). Ambas compartilham a mesma falha: acabam com dois padrões de bits distintos para o zero, "+0" e "-0", o que complica a lógica de comparação e o design de circuitos. O complemento de dois evita completamente esse "problema dos dois zeros" — cada padrão de bits corresponde a exatamente um valor inteiro.
Uma vantagem ainda maior do complemento de dois é que o mesmo circuito somador usado na adição também pode realizar a subtração, já que subtrair um número equivale a somar seu complemento de dois. A CPU não precisa saber ou se importar se um valor é positivo ou negativo; ela apenas soma padrões de bits e obtém o resultado correto em ambos os casos. Isso permite que a unidade lógica aritmética (ULA) dispense por completo um circuito de subtração dedicado, razão pela qual praticamente todas as arquiteturas de CPU modernas adotaram o complemento de dois para inteiros com sinal.
O overflow de inteiros é uma consequência direta dessa representação. Somar 1 ao máximo com sinal de 8 bits, 127 (01111111), simplesmente faz o padrão de bits virar 10000000 — que, interpretado como valor com sinal, é -128. Em C, o overflow de inteiros com sinal é tecnicamente um comportamento indefinido, o que significa que otimizações do compilador podem produzir resultados surpreendentes perto desse limite, merecendo cuidado real em código de produção. Já o Java especifica que o overflow dá a volta silenciosamente, um exemplo interessante de como as garantias de comportamento podem diferir entre linguagens mesmo quando a representação de bits subjacente é idêntica.