Informática

Complemento de dois: números negativos, faixa e estouro

Quando a prova pergunta como um computador guarda o número menos cinco, a resposta é complemento de dois. É um assunto curto, de cálculo exato e quase sem margem para interpretação, o que o torna ideal para estudar: se você domina o procedimento, acerta todas. Este guia mostra o método de conversão nos dois sentidos, a fórmula da faixa de valores, a subtração feita por soma e o estouro (overflow), com todas as contas conferidas por programa.

Não há norma sobre o tema; é fundamento de arquitetura de computadores. Para as conversões básicas entre binário, decimal e hexadecimal, comece em sistema binário, bits e bytes.

A ideia

Com n bits, existem 2^n combinações. Para representar também números negativos, a representação em complemento de dois divide as combinações em duas metades: as que começam com bit 0 são números não negativos, e as que começam com bit 1 são negativos. O bit mais à esquerda é, por isso, o bit de sinal.

A faixa de valores

Com n bits, os números representáveis em complemento de dois vão de −2^(n−1) até 2^(n−1) − 1.

Bits Menor valor Maior valor
4 −8 7
8 −128 127
16 −32.768 32.767

Note a assimetria: há um negativo a mais que positivos. O zero ocupa uma combinação (todos os bits zero), então sobra uma para o lado negativo. Sem sinal, com os mesmos 8 bits, a faixa seria de 0 a 255.

Como achar a representação de um número negativo

Método em dois passos para n bits:

  1. Escreva o valor absoluto em binário, completando com zeros à esquerda até n bits.
  2. Inverta todos os bits (complemento de um) e some 1 ao resultado.

Exemplo 1: −5 em 8 bits

  1. 5 em binário com 8 bits: 00000101.
  2. Inverter: 11111010.
  3. Somar 1: 11111011.

Resposta: −5 é 11111011. Conferência pela definição: na representação, o valor é −2^7 + a soma dos demais bits = −128 + (64 + 32 + 16 + 8 + 2 + 1) = −128 + 123 = −5.

Exemplo 2: outros valores em 8 bits

Decimal Binário em complemento de dois
5 00000101
−5 11111011
1 00000001
−1 11111111
127 01111111
−128 10000000
100 01100100
−100 10011100
0 00000000

Veja a regularidade: −1 é sempre “tudo 1”, e o menor valor negativo é 1 seguido de zeros. O método de inverter e somar 1 funciona nos dois sentidos: aplicado a 11111011, devolve 00000101.

Como ler um número que começa com 1

Se o bit de sinal for 1, o número é negativo. Há dois caminhos equivalentes.

Caminho A (inverter e somar 1): inverta, some 1 e coloque o sinal de menos.

Caminho B (peso negativo): o bit mais à esquerda vale −2^(n−1), e os demais valem seus pesos positivos usuais.

Exemplo 3: ler 11010110 (8 bits)

  1. Caminho B: −128 + 64 + 16 + 4 + 2 = −128 + 86 = −42.
  2. Caminho A: invertendo, 00101001 (41); somando 1, 00101010 (42); portanto −42.

Os dois caminhos dão −42. Já 01101110, que começa com 0, é positivo: 64 + 32 + 8 + 4 + 2 = 110.

Subtrair somando

A grande vantagem do complemento de dois é que o mesmo circuito somador faz somas e subtrações. Para calcular 13 − 5, soma-se 13 com a representação de −5.

  1. 13 em 8 bits: 00001101.
  2. −5: 11111011.
  3. Soma: 00001101 + 11111011 = 1 00001000. O resultado tem 9 bits; o bit extra à esquerda (vai-um final) é descartado.
  4. Resultado em 8 bits: 00001000 = 8.

Confere: 13 − 5 = 8.

Estouro (overflow)

Ocorre quando o resultado verdadeiro não cabe na faixa. Em 8 bits, o maior valor é 127.

Exemplo 4: 100 + 50 em 8 bits

  1. 100 é 01100100 e 50 é 00110010.
  2. A soma é 10010110.
  3. Como o bit de sinal ficou 1, a leitura é negativa: −128 + 22 = −106.

Somando dois positivos, o resultado deu negativo: isso sinaliza overflow, pois 150 não cabe em 8 bits com sinal (o limite é 127). A regra para detectar: a soma de dois números de mesmo sinal que dá resultado de sinal diferente indica estouro. Somar números de sinais diferentes nunca causa overflow.

No sentido inverso, −100 − 50 é −150, menor que −128. O resultado em 8 bits seria 01101010 (+106), de sinal contrário, também sinal de estouro.

Extensão de sinal

Para passar um número com sinal de 8 para 16 bits sem mudar o valor, replica-se o bit de sinal à esquerda. O número −5 (11111011) em 16 bits fica 1111111111111011. Completar com zeros, que serve para números sem sinal, trocaria o valor.

Pegadinhas de prova

  • Dizer que a faixa de 8 bits com sinal é de −127 a 127 (isso seria a representação sinal-magnitude, que tem dois zeros; o complemento de dois vai de −128 a 127).
  • Calcular o complemento de dois sem completar os bits à esquerda antes de inverter.
  • Ler 11111011 como 251: isso é a leitura sem sinal. Sem a informação do enunciado, a prova precisa dizer se o número tem sinal.
  • Esquecer de descartar o vai-um final na soma.
  • Achar que o overflow ocorre sempre que há vai-um final: o critério é o sinal do resultado (ou a coincidência dos dois últimos vai-um, conteúdo mais avançado).

Roteiro de resolução

  1. Identifique o número de bits e se o número tem sinal.
  2. Se o bit mais à esquerda for 0, leia como binário comum.
  3. Se for 1, use o caminho A ou B.
  4. Para converter um negativo em binário, escreva o módulo, inverta e some 1.
  5. Em somas, confira a faixa e o sinal do resultado.

Próximos passos

Siga para operações lógicas bit a bit e portas lógicas, hierarquia de memória e cache e RAID.

Fontes e atualização

Sem norma aplicável. Todas as representações e somas foram conferidas por programa. Confira no edital o programa de arquitetura de computadores e a notação adotada pela banca. Veja a metodologia do site.

Leia também

Para continuar no site

Viu algo errado, desatualizado ou confuso? Relatar erro nesta página