Skip to content

Calculadora de complemento de dois e inteiros com sinal

Digite um inteiro com sinal e obtenha de uma vez sinal-magnitude, complemento de um, complemento de dois e binário deslocado, de 4 a 64 bits. Ou cole um padrão de bits ou byte hexadecimal e veja as cinco leituras.

Sem rastreamento Roda no navegador Grátis
Tudo é calculado localmente no seu navegador — nada do que você digita é enviado.
Largura em bits

De decimal para representação de máquina

Digite um número inteiro com sinal. As quatro representações são calculadas de uma vez — você não precisa saber de antemão qual delas o seu sistema usa.

Experimente estes
Codificação Bits Hex
Sinal-magnitude 1000 0101 85
Complemento de um 1111 1010 FA
Complemento de dois 1111 1011 FB
Binário deslocado 0111 1011 7B

De padrão de bits para valor

Você achou um byte em um despejo de memória ou em um registrador e não sabe como ele deve ser lido. Cole aqui e veja de uma vez o que ele significa sob cada interpretação — qual é a certa depende do sistema que o produziu, então todas são exibidas.

Lido como Valor
Sem sinal 251
Sinal-magnitude -123
Complemento de um -4
Complemento de dois -5
Binário deslocado 123
Tabela de referência de 8 bits

Calculada pelo mesmo mecanismo que a ferramenta acima usa, então estes valores não têm como sair de sincronia com ela.

Decimal Sinal-magnitude Complemento de um Complemento de dois Binário deslocado Hex
127 0111 1111 0111 1111 0111 1111 1111 1111 7F
100 0110 0100 0110 0100 0110 0100 1110 0100 64
10 0000 1010 0000 1010 0000 1010 1000 1010 0A
5 0000 0101 0000 0101 0000 0101 1000 0101 05
1 0000 0001 0000 0001 0000 0001 1000 0001 01
0 0000 0000 0000 0000 0000 0000 1000 0000 00
-1 1000 0001 1111 1110 1111 1111 0111 1111 FF
-5 1000 0101 1111 1010 1111 1011 0111 1011 FB
-10 1000 1010 1111 0101 1111 0110 0111 0110 F6
-100 1110 0100 1001 1011 1001 1100 0001 1100 9C
-127 1111 1111 1000 0000 1000 0001 0000 0001 81
-128 1000 0000 0000 0000 80
Faixas de valores por largura em bits
Largura Complemento de dois / binário deslocado Sinal-magnitude / complemento de um
4 -8 … 7 -7 … 7
8 -128 … 127 -127 … 127
16 -32768 … 32767 -32767 … 32767
32 -2147483648 … 2147483647 -2147483647 … 2147483647
64 -9223372036854775808 … 9223372036854775807 -9223372036854775807 … 9223372036854775807
Cada codificação é assegurada na bateria de testes nas cinco larguras, incluindo a faixa completa de 4 bits, os dois padrões do zero e o valor mais negativo de cada largura. Os resultados de 64 bits são conferidos contra as próprias BigInt.asIntN e BigInt.asUintN do JavaScript. — Equipe de Engenharia da Go-Tools · Sep 9, 2026

Construída e verificada pela equipe de engenharia da Go Tools.

Respostas rápidas

Quanto é −5 em complemento de dois de 8 bits?

11111011 11111011, que é 0xFB.

Qual é a faixa de um byte com sinal?

-128 … 127 De −128 a 127 em complemento de dois; de −127 a 127 em sinal-magnitude e em complemento de um.

Como volto de um padrão em complemento de dois para o número?

valor − 2^n Se o bit mais alto for 0, leia como sem sinal; se for 1, subtraia 2^n da leitura sem sinal.

0xFF significa −1 ou 255?

−1 ou 255 −1 como byte com sinal, 255 como byte sem sinal. Os bits sozinhos não decidem isso.

O que é complemento de dois?

O complemento de dois responde a uma pergunta de hardware, não de matemática: como guardar números negativos de modo que o somador já construído continue funcionando? O truque é representar −x pelo padrão de 2^n − x. A soma então dá a volta módulo 2^n e cai na resposta certa sem nenhum caso especial para sinais, e é por isso que a subtração não precisa de um circuito próprio.

Daí decorrem duas consequências, e as duas aparecem em bugs reais. Primeira, a faixa é assimétrica: oito bits cobrem de −128 a 127, não de −128 a 128, porque os padrões precisam ser repartidos e não existe um zero negativo para equilibrar as contas. Segunda, o sinal não é uma flag que dá para arrancar — o bit mais alto de 11111011 é 1, mas o valor é −5 e não −123, então ler um número negativo significa interpretar a palavra inteira, não olhar um bit só.

Sinal-magnitude e complemento de um são os dois projetos que perderam. Ainda vale conhecê-los porque o ponto flutuante IEEE 754 manteve o leiaute de sinal-magnitude, e porque é a comparação com eles que faz o complemento de dois parecer inevitável em vez de arbitrário.

// -5 as an 8-bit byte, three ways to arrive at the same pattern
0b00000101        // 5
~0b00000101       // 11111010  ones' complement of 5
~0b00000101 + 1   // 11111011  two's complement = -5

// In JavaScript the width matters: bitwise operators are 32-bit,
// so anything wider has to go through BigInt.
BigInt.asIntN(8, 0xFBn)                 // -5n
BigInt.asUintN(8, -5n)                  // 251n
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn)  // -5n

// C23 made two's complement mandatory for signed integers.
// Before that, the other two encodings were legal but unused.

O que esta calculadora faz

Quatro codificações de uma vez

Sinal-magnitude, complemento de um, complemento de dois e binário deslocado são calculados juntos. O binário deslocado é o que a maioria das calculadoras deixa de fora, e é justamente o que os datasheets de ADC continuam usando.

Consulta inversa a partir de um padrão de bits

Cole os bits ou o hexadecimal que você realmente tem e veja as cinco leituras, a sem sinal inclusa. Esse é o sentido de que você precisa quando um despejo discorda do número que o dispositivo informa.

Correta em 64 bits

Cada valor é tratado com BigInt, então 0xFFFFFFFFFFFFFF9C resolve para −100 e não para o que um truncamento de 32 bits produziria.

Honesta sobre o que não tem representação

Na largura 8, −128 não tem forma em sinal-magnitude nem em complemento de um. A tabela diz isso em vez de imprimir um padrão que não significa esse número.

Zero negativo tornado visível

Digite 0 e o segundo padrão de bits do zero em sinal-magnitude e em complemento de um aparece, que é o argumento isolado mais claro de por que o complemento de dois venceu.

Tabelas de referência sem JavaScript

A tabela comparativa de 8 bits e as faixas por largura são renderizadas na construção da página, pelo mesmo mecanismo que alimenta os campos interativos, então não têm como sair de sincronia com ele.

Comparação com outras formas de conferir

A conversão da sua própria linguagem

API de execução

BigInt.asIntN, o int.from_bytes(..., signed=True) do Python e os tipos de largura fixa do C dão a resposta com autoridade para o código que você está escrevendo. Use-os no código; use esta página quando você tem um valor na frente e nenhum interpretador aberto.

A visão de memória de um depurador

Recurso de IDE

Ela mostra o valor com o tipo que o programa declarou, que é exatamente a informação que falta a um padrão de bits. Não ajuda quando os bytes chegaram por um fio sem tipo declarado — e é esse o caso para o qual esta página existe.

Conversor de base

Este site

Ele converte entre bases, mas só para valores não negativos — negativos são recusados lá de forma explícita, porque uma base não tem opinião sobre como um sinal é guardado. A representação com sinal é trabalho desta página; use o conversor de base para as magnitudes.

Conversor IEEE 754

Este site

A contraparte em ponto flutuante. Ele mantém um leiaute de sinal-magnitude em vez de complemento de dois e polariza o expoente por 2^(e−1)−1, então as duas páginas respondem a perguntas diferentes sobre a mesma palavra de memória.

Exemplos resolvidos

−5 em um byte de 8 bits

-5, largura 8
sinal-magnitude     1000 0101
complemento de um   1111 1010
complemento de dois 1111 1011  (0xFB)
binário deslocado   0111 1011

As três codificações concordam no bit de sinal e discordam em todo o resto. Só a linha do complemento de dois é o que um int8_t de C guarda de fato.

O byte 0xFB lido de cinco maneiras

0xFB, largura 8
sem sinal           251
sinal-magnitude     -123
complemento de um   -4
complemento de dois -5
binário deslocado   123

−128 não tem forma em sinal-magnitude

-128, largura 8
sinal-magnitude     sem representação
complemento de um   sem representação
complemento de dois 1000 0000  (0x80)
binário deslocado   0000 0000

Sinal-magnitude e complemento de um gastam cada um um padrão de bits com o zero negativo, então vão de −127 a 127 e não alcançam −128. Ferramentas que imprimem um byte aqui estão erradas.

Um valor de registrador de 64 bits

0xFFFFFFFFFFFFFF9C, largura 64
complemento de dois -100
sem sinal           18446744073709551516

Qualquer coisa acima de 32 bits precisa ser feita com BigInt. Os operadores |, << e >>> do JavaScript truncam para 32 bits em silêncio, e é por isso que algumas calculadoras online devolvem aqui uma resposta errada em vez de um erro.

Como usar a calculadora de complementos

  1. 1

    Escolha a largura em bits

    4, 8, 16, 32 ou 64. Isso não é uma preferência de exibição: os mesmos bits significam números diferentes em larguras diferentes, então errar aqui muda a resposta.

  2. 2

    Digite um decimal com sinal

    Digite um número inteiro, com o sinal de negativo incluído. As quatro codificações se atualizam conforme você digita, junto com a forma hexadecimal de cada uma.

  3. 3

    Ou vá no sentido inverso, a partir dos bits

    Cole uma cadeia binária ou um valor 0x no campo de decodificação para ver o que aquele padrão exato significa sob cada interpretação, incluindo a leitura sem sinal.

  4. 4

    Leia os avisos quando aparecerem

    A página sinaliza os dois casos em que todo mundo tropeça: o valor mais negativo não tem forma em sinal-magnitude nem em complemento de um, e o zero tem um segundo padrão de bits nessas duas codificações.

Erros que produzem respostas erradas

Esquecer o +1

Inverter os bits dá o complemento de um. Parar aí deixa o resultado a uma unidade do complemento de dois, e o erro passa fácil porque o que sai continua parecendo um número negativo plausível.

✗ Incorreto
5   = 00000101
~5  = 11111010   <- ones' complement, not -5
✓ Correto
5        = 00000101
~5       = 11111010
~5 + 1   = 11111011   <- -5 in two's complement

Usar operadores bit a bit de 32 bits em um valor de 64

O JavaScript trunca para 32 bits os operandos dos operadores bit a bit. A metade alta some sem erro nenhum, então o resultado é errado em vez de ausente.

✗ Incorreto
0xFFFFFFFFFFFFFFFB        // 18446744073709552000  -- the literal is already rounded
~0xFFFFFFFFFFFFFFFB + 1   // 0  -- silently wrong, expected -5
✓ Correto
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn)   // -5n

Estender um valor negativo com zeros

Alargar preenchendo com zeros preserva o número apenas quando ele é positivo. Para um valor negativo, o bit de sinal precisa ser replicado por todos os bits novos.

✗ Incorreto
int8  0xFB  (-5)
int16 0x00FB  (251)   <- zero-extended
✓ Correto
int8  0xFB  (-5)
int16 0xFFFB  (-5)    <- sign-extended

Dar uma forma em sinal-magnitude ao valor mais negativo

−128 não tem representação em sinal-magnitude nem em complemento de um com oito bits, porque as duas codificações gastam um padrão com o zero negativo. Imprimir 10000000 para ele confunde a resposta do complemento de dois com uma codificação incapaz de expressar esse número.

✗ Incorreto
-128 sign-magnitude: 10000000   <- that pattern means -0
✓ Correto
-128 sign-magnitude: no representation at width 8
-128 two's complement: 10000000

Quando isso é realmente necessário

Ler um registrador de sensor
Um registrador de temperatura devolve 0xFF9C. Sem sinal isso é 65436, que não é uma temperatura. Na largura 16 a linha do complemento de dois mostra −100, e com um fator de escala de 0,1 °C o sensor está dizendo −10,0 °C.
Depurar um protocolo com campos sem tipo
Modbus, CAN e a maior parte da telemetria binária carregam palavras cruas sem indicação de sinal. Quando um cliente e um dispositivo discordam sobre um valor, conferir as duas leituras da mesma palavra costuma identificar qual lado fez a suposição errada.
Exercícios de organização de computadores
Sinal-magnitude, complemento de um, complemento de dois e binário deslocado são o quarteto padrão de uma disciplina introdutória. Tê-los lado a lado na mesma largura torna as diferenças visíveis em vez de decoradas.
Caçar estouro de inteiro
Quando um contador salta de 2147483647 para −2147483648, ver os dois como padrões de 32 bits mostra que o vai-um caiu no bit de sinal. O valor não virou lixo: ele deu a volta exatamente como a codificação manda.
Escrever código de serialização
Antes de confiar em um codificador escrito à mão, confira um valor negativo de cada largura contra esta página. Um erro de sinal é fácil de escrever e produz uma saída estruturalmente impecável até chegar o primeiro negativo de verdade.

Como as quatro codificações são construídas

Sinal-magnitude
O bit mais alto é o sinal e os n−1 bits restantes são a magnitude, lida como um número sem sinal comum. A faixa vai de −(2^(n−1)−1) a 2^(n−1)−1, simétrica, com dois zeros. É o leiaute que o IEEE 754 usa para ponto flutuante.
Complemento de um
Um valor negativo é o inverso bit a bit da sua magnitude, equivalentemente 2^n − 1 − x. Mesma faixa e mesmos dois zeros do sinal-magnitude. A soma exige vai-um circular, que é exatamente a complicação que o complemento de dois elimina. Em inglês a posição do apóstrofo não é erro de digitação: ones' complement se refere a uma palavra toda de uns, enquanto two's complement se refere a uma única potência de dois.
Complemento de dois
Um valor negativo −x é guardado como 2^n − x. A faixa vai de −2^(n−1) a 2^(n−1)−1, deliberadamente assimétrica, com um zero só. Soma, subtração e a multiplicação da palavra baixa são todas indiferentes ao sinal, e essa é toda a razão de ele ter vencido.
Binário deslocado
Guarda valor + 2^(n−1), de modo que −2^(n−1) vira tudo zero e os padrões ordenam na mesma ordem dos valores que codificam. Equivale ao padrão do complemento de dois com o bit mais alto invertido. Cuidado com a nomenclatura: os campos de expoente do IEEE 754 são polarizados por 2^(e−1)−1, um a menos que o deslocamento usado aqui.
Por que a aritmética usa BigInt
O JavaScript converte os operandos de &, |, ~ e dos deslocamentos para inteiros de 32 bits antes de operar e converte de volta depois, então um valor de 64 bits perde a metade alta sem que nenhum erro seja levantado. Toda conversão desta página é feita sobre inteiros de precisão arbitrária, e é também por isso que os extremos de 64 bits saem exatos.

Lidando corretamente com valores com sinal

Fixe a largura antes de qualquer coisa
Um padrão de bits não tem valor enquanto você não disser qual é a largura do campo. A maioria das divergências entre um datasheet e um depurador se resume a um lado assumindo 16 bits e o outro 32.
Trate o valor mais negativo como caso especial
Negá-lo estoura em qualquer largura — em complemento de dois, −(−128) continua sendo −128 para um byte com sinal. Todo código que calcula valor absoluto precisa de um plano para essa entrada, e toda bateria de testes deveria contê-la.
Nunca deduza dos dados se o campo tem sinal
Nenhuma inspeção dos bits diz se um campo é com sinal. Tire isso do datasheet, do esquema ou da definição da struct; chutar funciona até chegar o primeiro valor negativo em produção.
Estenda o sinal ao alargar
Copiar um 0xFB de 8 bits para um campo de 16 como 0x00FB transforma −5 em 251. Alargar um valor com sinal significa replicar o bit de sinal, o que dá 0xFFFB.
Prefira a conversão da própria linguagem
BigInt.asIntN em JavaScript, int.from_bytes(..., signed=True) em Python e os tipos de largura fixa em C dizem o que querem dizer e resolvem as bordas. O ~x + 1 feito à mão é de onde vêm os bugs de largura.

Perguntas frequentes

O que é complemento de dois, em uma frase?
É a convenção pela qual um número negativo −x é guardado com o padrão de bits de 2^n − x, o que faz soma e subtração usarem o mesmo circuito e deixa exatamente um zero na reta numérica.
Como calculo um complemento de dois na mão?
Escreva a magnitude em binário, inverta todos os bits e some 1. Para o 5 em oito bits: 000001011111101011111011. Só a inversão já dá o complemento de um, e é por isso que os dois estão sempre a uma unidade de distância.
Por que −128 cabe em um byte com sinal e +128 não?
O complemento de dois é deliberadamente assimétrico. Com n bits ele cobre de −2^(n−1) a 2^(n−1)−1, porque não desperdiça um padrão com o zero negativo como fazem o sinal-magnitude e o complemento de um. Essa vaga extra cai no lado negativo.
11111011 é −5 ou 251?
Os dois, e só pelos bits não dá para saber. A resposta depende do tipo que o sistema produtor declarou. Por isso a consulta inversa desta página mostra todas as leituras ao mesmo tempo em vez de escolher uma por você — pegue a linha que corresponde ao seu int8_t ou ao seu uint8_t.
O que é binário deslocado e onde eu encontro isso?
O binário deslocado (também chamado de excesso-K ou polarizado) guarda valor + 2^(n−1), de modo que o menor valor fica todo em zeros e ordenar os padrões brutos como inteiros sem sinal ordena também os valores com sinal. Ele aparece em saídas de conversores ADC e DAC e em formatos de amostras de áudio. Atenção: os expoentes do IEEE 754 usam outra polarização — 2^(e−1)−1, não 2^(e−1) — então não transporte o número de um caso para o outro.
Por que um registrador Modbus lê 65436 quando o sensor diz −100?
O Modbus transporta palavras de 16 bits sem nenhuma informação de tipo, então um cliente que assume sem sinal imprime 65436 enquanto o dispositivo queria dizer o valor −100 em complemento de dois. Cole aqui 65436 como hexadecimal 0xFF9C na largura 16 e a linha do complemento de dois mostra a leitura pretendida.
Sinal-magnitude e complemento de um ainda são usados?
Raramente para inteiros — praticamente toda CPU atual usa complemento de dois, e o C23 finalmente o tornou obrigatório. Eles continuam relevantes porque o ponto flutuante IEEE 754 mantém um leiaute de sinal-magnitude e porque os dois ainda aparecem em provas de organização de computadores.
Por que algumas calculadoras erram em valores de 64 bits?
Os operadores bit a bit do JavaScript convertem os operandos para inteiros de 32 bits antes de operar, então uma página que usa ~x + 1 perde em silêncio a metade alta de um valor de 64 bits e informa um resultado plausível, mas errado. Esta ferramenta usa BigInt do começo ao fim, e é por isso que as linhas de 64 bits daqui batem com o que o seu depurador mostra.
O que é zero negativo e por que isso importa?
Em sinal-magnitude, 00000000 e 10000000 significam zero os dois; em complemento de um são 00000000 e 11111111. Duas comparações que deveriam dar iguais podem, portanto, sair diferentes bit a bit. O complemento de dois tem um único zero, o que eliminou toda uma classe de casos especiais no hardware.
Algo do que eu digito é enviado para um servidor?
Não. A página entrega o mecanismo de conversão ao seu navegador e o executa aí. Despejos de registradores e valores de firmware costumam vir de sistemas que você não pode compartilhar, então aqui não há nada em que acreditar por confiança — a aba de rede basta, porque nenhuma requisição é feita.

Ferramentas relacionadas

Ver todas as ferramentas →