Para realizar as operações de subtração e adição, a maior parte dos computadores modernos utiliza o sistema de complemento de 2 para representar números negativos em binário.
Em binário essa representação difere da forma decimal e algumas operações precisam ser realizadas para se ter uma correspondência correta. Neste artigo entenderemos como representar números positivos e negativos em binário e o papel do complemento de 2 nisto.
Complemento de 2
Primeiramente, é preciso relembrar que na representação binária possuímos apenas dois dígitos para escrever números: 0 e 1. Assim, para diferenciar números positivos de negativos utilizamos o bit de sinal que será o bit mais significativo, ou seja, o MSB é aquele que irá informar o sinal do número:
- Se este dígito for 0, o número é positivo
- Se for 1, o número é negativo
Nesse contexto, os números são escritos da seguinte forma:
Números positivos
Seu valor é representado na forma binária direta, sendo acrescido um bit de sinal 0 na frente do MSB do número binário.
Instrução:
(bit 0) + o número em binário.
Exemplos:
Números negativos
Seu valor é representado na forma de complemento a 2 e um bit de sinal 1 é colocado na frente do MSB.
O complemento a 2 é realizado da seguinte forma:
- Invertemos todos os bits do número binário, ou seja, tudo que é 0 vira 1 e vice-versa;
- Somamos um (0001) ao valor invertido.
Assim, é preciso entender dois pontos importantes:
- Quando trabalhamos com complemento de 2 se o número binário tem dígito 1 no MSB significa que ele é negativo;
- Para saber o valor que aquele número representa, precisamos realizar a operação de inverter e depois somar um.
Instrução:
(bit 1 no MSB significa número negativo) e o número em binário precisa ser invertido e somado com 1 para determinar seu valor.
Exemplos:
Para demonstrar o complemento de 2 na prática, na Tabela 1 temos a representação de todos os valores possíveis que podem ser escritos com 4 bits em binário, decimal, hexadecimal e complemento de 2.
| Binário | Decimal | Hexadecimal | Complemento de 2 |
| 0000 | 0 | 0 | 0 |
| 0001 | 1 | 1 | 1 |
| 0010 | 2 | 2 | 2 |
| 0011 | 3 | 3 | 3 |
| 0100 | 4 | 4 | 4 |
| 0101 | 5 | 5 | 5 |
| 0110 | 6 | 6 | 6 |
| 0111 | 7 | 7 | 7 |
| 1000 | 8 | 8 | -8 |
| 1001 | 9 | 9 | -7 |
| 1010 | 10 | A | -6 |
| 1011 | 11 | B | -5 |
| 1100 | 12 | C | -4 |
| 1101 | 13 | D | -3 |
| 1110 | 14 | E | -2 |
| 1111 | 15 | F | -1 |
Note que na representação em decimal os números vão de 0 a 15 enquanto que na representação em complemento de 2 vão de -8 a 7.
Isso também pode ser observado quando estamos programando, na linguagem C temos os tipos uint_8t e int_8t, que tem o sentido de:
uint8_t:
- “u” é de unsigned, ou seja, sem sinal
- “int” de inteiro
- “8_t” quantidade de bits
int8_t:
- a ausência do “u” indica tipo com sinal
- “int” de inteiro
- “8_t” quantidade de bits
Assim, quando escolhemos o tipo uint8_t podemos escrever valores de 0 a 255, já no tipo int8_t os valores vão de -128 a 127.
Referências
TOCCI, R.; WIDMER, N.; MOSS, G. Sistemas Digitais – Princípios e Aplicações. [S.l.]: Pearson Education Limited, 2011.
Saiba mais
Números binários: o que você precisa saber










Gosto demais de seus artigos. Peço desculpas a dar minha opinião.
Observei que na conversão de 1001b para complemento de dois foi feito:
1001b → inverte os bits, ou seja, 0110b, depois adiciona 1 = 0111b. O problema que o texto descreve que 0110b é -7 (sete negativo). Acredito que seja 7 positivo já que tem zero no MSb. Esse problema acontece nos outros exemplos.