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

Tanto a representação de sinal e magnitude quanto a de complemento de um acabam com dois padrões de bits distintos para o zero ("+0" e "-0"), o que complica os circuitos de comparação e aritmética. O complemento de dois tem exatamente um padrão de bits para o zero e, tão importante quanto isso, o mesmo circuito somador que realiza a adição também pode realizar a subtração. Essas duas propriedades permitem que os projetistas de CPU simplifiquem a unidade lógica aritmética, razão pela qual quase todos os processadores modernos usam internamente o complemento de dois para inteiros com sinal.

De -128 a 127. Como o bit mais significativo é reservado para o sinal, existem apenas 128 padrões distintos do lado positivo (0 a 127), mas o lado negativo pode representar 128 valores distintos (-1 a -128), já que o complemento de dois tem apenas um padrão de bits para o zero, deixando um padrão extra disponível do lado negativo — daí o intervalo assimétrico.

O complemento de um forma um número negativo simplesmente invertendo cada bit do valor positivo. O complemento de dois vai um passo além e soma 1 depois de inverter. Esse passo extra elimina o "problema dos dois zeros" inerente ao complemento de um (00000000 para "+0" e 11111111 para "-0"), razão pela qual o complemento de dois se tornou o padrão.

Como a largura de bits é fixa, qualquer resultado aritmético que exceda o intervalo representável tem seu bit de ordem mais alta truncado, o que muda o significado do bit de sinal. Por exemplo, somar 1 ao máximo com sinal de 8 bits, 127, produz o padrão de bits 10000000, interpretado como -128 pelas regras com sinal. Ultrapassar o limite superior leva de volta ao limite inferior — esse salto contraintuitivo é exatamente o que é o overflow.

O padrão de bits em si não muda, mas, sem tratar o bit mais significativo como sinal, cada bit simplesmente contribui com seu valor posicional normal. Por exemplo, o padrão de 8 bits 11111011 equivale a -5 quando lido com sinal, mas a 251 quando lido sem sinal. Essa reinterpretação exata acontece na prática sempre que você usa um tipo "sem sinal", como o unsigned int do C, em um valor antes tratado como com sinal.
ツールくん

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.