Conteúdos da cadeira

Inteiros em complemento para dois

Inteiros sem sinal, negação em complemento para dois, extensão de sinal e overflow.

Markdown

Perguntar sobre esta página

ChatGPTClaudePerplexityGeminiCopiar e abrir

Envia o link e pede à IA para ler a página. No Gemini, cola a pergunta copiada.

Ver pergunta para copiar
Nesta página

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 nn bits sem sinal, há 2n2^n combinações, que representam os inteiros de 00 até 2n12^n - 1. 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 nn bits, o intervalo é assimétrico: vai de 2n1-2^{n-1} até 2n112^{n-1} - 1. Com 8 bits, vai de 128-128 até 127127. 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 x-x a partir de xx positivo com nn bits, há duas formas equivalentes. A definição diz que x-x se representa por 2nx2^n - x. Na prática, usa-se a regra inverter e somar 1: invertem-se todos os bits e soma-se 1 ao resultado.

Representa 112-112 com 8 bits. Primeiro escreve 112112:

112=64+32+16=011100002112 = 64 + 32 + 16 = 01110000_2

Inverte os bits: 1000111110001111. Soma 1:

  10001111
+        1
= 10010000

Por isso 11210=100100002-112_{10} = 10010000_2 em 8 bits. Confirma pela definição: 28112=256112=1442^8 - 112 = 256 - 112 = 144, e 144144 em binário é 1001000010010000. 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 (0110111101101111) e soma 1 (01110000=11201110000 = 112), logo o valor é 112-112. 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 nn bits para mm bits, com m>nm > n, não chega acrescentar zeros à esquerda: isso transformaria um negativo num positivo grande. A extensão de sinal acrescenta mnm - n cópias do bit de sinal.

O valor 112-112, 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 112112 (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 127+1127 + 1:

  01111111   (127)
+ 00000001   (1)
= 10000000   (-128!)

Dois positivos deram um negativo, por isso houve overflow: o resultado correto, 128128, não cabe no intervalo de 128-128 a 127127. Repara que o hardware faz a conta certa nos bits; o problema é que o resultado não é representável. Noutro exemplo, 1121-112 - 110001111, que é 113-113 e está dentro do intervalo, por isso não há overflow.

Experimenta: representa 19-19 em 8 bits e confirma que obténs 11101101. (Verifica: 19=0001001119 = 00010011, invertido 1110110011101100, mais 1 dá 1110110111101101. Pela definição: 25619=237=128+64+32+8+4+1256 - 19 = 237 = 128 + 64 + 32 + 8 + 4 + 1.)

Ver o ficheiro no GitHub

À tua maneira

Escolhe como preferes ler.

Aparência
Ajustar cores e largura
Cor de destaque do tema FEUP
Tipo de letra

Álgebra, lógica e uma ideia de cada vez.

As tuas escolhas ficam guardadas neste navegador.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.