Inteiros em complemento para dois
Inteiros sem sinal, negação em complemento para dois, extensão de sinal e overflow.
A página anterior tratou de números positivos. Falta o sinal. Se reservarmos simplesmente um bit para o sinal e os restantes para o valor, obtemos duas representações para o zero e a soma passa a exigir um circuito especial. A solução usada nos processadores é o complemento para dois, que representa os negativos de forma que a adição funcione igual para todos os números.
Inteiros sem sinal
Com bits sem sinal, há combinações, que representam os inteiros de até . Com 8 bits, o intervalo é de 0 a 255. Não há surpresas aqui; é a contagem binária direta que já conheces.
Inteiros com sinal
Em complemento para dois com bits, o intervalo é assimétrico: vai de até . Com 8 bits, vai de até . O bit mais à esquerda continua a ser o MSB, mas agora funciona como bit de sinal: 0 indica um número não negativo e 1 indica um negativo.
Para obter a representação de a partir de positivo com bits, há duas formas equivalentes. A definição diz que se representa por . Na prática, usa-se a regra inverter e somar 1: invertem-se todos os bits e soma-se 1 ao resultado.
Representa com 8 bits. Primeiro escreve :
Inverte os bits: . Soma 1:
10001111
+ 1
= 10010000
Por isso em 8 bits. Confirma pela definição: , e em binário é . As duas vias dão o mesmo resultado, como têm de dar.
Para voltares atrás, aplica a mesma regra ao contrário: para saberes que valor representa 10010000, inverte () e soma 1 (), logo o valor é . A operação é simétrica, exceto num caso limite que vais ver já a seguir.
Extensão de sinal
Quando copias um número de bits para bits, com , não chega acrescentar zeros à esquerda: isso transformaria um negativo num positivo grande. A extensão de sinal acrescenta cópias do bit de sinal.
O valor , que em 8 bits é 10010000, em 16 bits escreve-se 11111111 10010000. Oito cópias do bit 1 à esquerda preservam o valor. Para um positivo como (01110000), a extensão acrescenta zeros: 00000000 01110000, que é exatamente o que já farias.
Overflow
O overflow acontece quando uma operação aritmética produz um resultado que precisa de mais bits do que a representação disponível. Em complemento para dois, deteta-se pelo sinal: somar dois positivos e obter um negativo, ou somar dois negativos e obter um positivo, indica overflow.
O exemplo clássico usa 8 bits. Soma :
01111111 (127)
+ 00000001 (1)
= 10000000 (-128!)
Dois positivos deram um negativo, por isso houve overflow: o resultado correto, , não cabe no intervalo de a . Repara que o hardware faz a conta certa nos bits; o problema é que o resultado não é representável. Noutro exemplo, dá 10001111, que é e está dentro do intervalo, por isso não há overflow.
Experimenta: representa em 8 bits e confirma que obténs
11101101. (Verifica: , invertido , mais 1 dá . Pela definição: .)