Números Binários com Sinal

Para passarmos às operações seguintes vamos ter que introduzir um conceito novo na representação de números.
Os números que até agora aqui temos vindo a referir são sempre números sem sinal, portanto sempre positivos.
Mas na realidade os números podem ser positivos ou negativos e têm que ser representados como tal e de forma que o computador entenda.
O nosso sinal de menos (-), para o computador é um gráfico correspondente a uma combinação de 8 bits.
Convencionou-se então que o sinal é representado pelo bit de maior ordem. Por exemplo, num número de 8 bits será o bit de ordem 7, isto é, no Byte

X7 X6 X5 X4 X3 X2 X1 X0

X7 representa o sinal do número, sendo que esse bit assume o valor 0 para números positivos e o valor 1 para números negativos.
O número de bits disponível para representar a parte sem sinal do número é menor (7 bits neste caso). Assim, o valor absoluto máximo do número  representável por 8 bits passa a ser menor (128 em lugar de 256) embora  a gama de números representáveis seja a mesma (8 bits representam 256 números possíveis de -128 a +127).

Dos vários métodos existentes o mais utilizado para representar números com sinal, aquele de que vamos falar, é a representação em complemento para 2.

Números em Complemento para 2

Neste método e para números de 8 bits:

  • Os números negativos representam-se de forma decrescente na sua parte sem sinal, desde 11111111 (–1 decimal) até 10000000 (-128 decimal).
  • Os números positivos representam-se de forma crescente na sua parte sem sinal desde 00000000 (0 decimal) até  01111111 (+127 decimal).
Figura 1

Podemos verificar que 0 é considerado por este método como um número positivo e que, com 8 bits conseguimos representar 128 números negativos (-128 a -1) e 128 números positivos (0 a 127).
O mesmo vale para Palavras com qualquer número de bits, usando um raciocínio idêntico. Veja-se na tabela da Figura 1, a gama de valores decimais representáveis por 4 bits, correspondendo o de maior ordem ao sinal e os restantes 3, à parte sem sinal do número.

Mas sendo assim, todos os números em binário de que temos vindo a falar têm o primeiro bit como representante do sinal?

Não, não é obrigatoriamente assim. Depende do circuito a que é enviado.  O bit de maior ordem pode ser um bit significativo para os números sem sinal ou o sinal para os números com sinal. E cada circuito sabe como interpretar os números que lhe são enviados. Um exemplo de números sem sinal são os endereços de memória.
Os circuitos para números sem sinal são mais simples, para além de que, se estivermos a lidar com números que serão sempre positivos, como os endereços, representando-os como números sem sinal permite com o mesmo número de bits abranger uma maior gama de representação.
Com 32 bits por exemplo, com uma representação de número sem sinal conseguimos endereçar  de 0 a 4.294.967.296 posições de memória e com uma representação de números com sinal conseguimos endereçar de 0 a 2.147.483.648 posições de memória, atendendo a que a gama de representações negativas não nos interessa.
Concluindo, compete-nos a nós a decisão em cada caso.

Voltando à representação em complemento para 2, vamos introduzir mais um conceito. O Simétrico de um número binário.

Simétrico de um Número Binário

O Simétrico de um número é o número que somado com o ele dá 0. Isto serve para qualquer número em qualquer base. O simétrico de um número decimal obtém-se trocando-lhe o sinal (-) para (+) e vice versa.

E o simétrico de um binário. Como é que o obtemos?

O simétrico de um número binário determina-se negando os bits desse número e somando-lhe 1.

Negar os bits?

Negar os bits é convertê-los no oposto, um a um, 0 em 1 e 1 em 0.

E como é  que o computador faz isso?

Experimentem aplicar o operador XOR a qualquer número binário confrontado com outro com o mesmo número de bits e todos a 1.
Porque XOR é o operador diferença, se os operandos forem diferentes devolve 1, se os operandos forem iguais devolve 0. Portanto se o bit do número a inverter for 0 resulta 1 e se for 1 resulta 0. Por exemplo:

0110  XOR 1111 = 1001

Figura 2

Vamos então determinar o simétrico de +6 usando esta regra. Vamos ver como na Tabela da Figura 2. Primeiro traduzimos +6 para binário, o que dá 0110, sendo 0 o sinal de positivo e 110 a representação de 6 positivo em binário. Depois negamos os bits como já vimos no exemplo atrás, resultando 1001. E agora somamos a este o valor 0001 (1 em decimal). Obtém-se 1010 em que, 1 é o sinal de negativo e 010 a representação de 6 negativo, como se pode ver na tabela da Figura 1.

Começámos por dar um exemplo da determinação do simétrico de um número contido na tabela dos 4 bits. A partir daqui vamos passar a lidar com números de 8 bits em complemento para 2, isto é, em que o bit de maior ordem representa o sinal e os outros 7 representam o número. Vamos então determinar o complemento de 55.

Primeiro temos que converter 55 em binário, por isso vamos ver como é que se faz uma conversão de decimal em binário.

Conversão de Decimal em Binário

  • Figura-3-7
    Figura 3

    Dividimos 55 por 2. O resto da divisão é o valor do bit de menor ordem.

  • Depois vamos dividindo sucessivamente os resultados obtidos também por dois. O resto de cada divisão vai correspondendo, pela ordem obtida, ao bit de ordem superior ao anterior.
  • Quando chegarmos a um resultado da divisão inferior a 2 esse valor corresponde ao bit de maior ordem representativo para 55.

E cá está: 110111, o valor binário de 55. No gráfico e na tabela da Figura 3 está exemplificada a conversão de 55 em binário.
Mas  só tem 6 bits e nós dissemos que a partir daqui íamos trabalhar com números de 8 bits.

Certamente vamos ter que arranjar outro número!

Claro que não. Vamos fazer a extensão do número de 6 bits a 8 bits. Extensão Binária, mais um conceito a introduzir.

Extensão Binária

Em operações em binário os operandos devem ter o mesmo número de bits. Por oposição com o que se passa com os nossos números, onde os valores não significativos à esquerda (os 0) são ignorados e não preenchidos, os bits têm que ter sempre o seu valor 0 ou 1 definido. Como estamos a lidar com circuitos de 8 bits, todos os 8 bits devem ter um valor estabelecido. Vamos preparar uma operação binária a 8 bits com os números 55 e 2.

O primeiro, 55, representa-se com 6 bits. A sua extensão a 8 bits pode ser feita com bits a 0, pois o seu valor permanece o mesmo:

00110111

em que 00 é a extensão e 110111 o número.
O segundo, 2, representa-se com 2 bits. Com os mesmos pressupostos a sua extensão, feita com bits a 0, será:

00000010

em que 000000 é a extensão e 10 o número.

Agora já podemos fazer operações com eles. Mas como puderam verificar, o que fizemos foi para números sem sinal. Mas esta não é a nossa realidade. Temos que ver como se pode fazer esta extensão em números com sinal representados em complemento para 2. Primeiro vamos por o sinal nos números.

A representação binária para (+55) será:

0110111

onde 0 é o sinal e 110111 é o número.
A representação binária para (+2) será:

010

onde 0 é o sinal e 10 o número.
E agora também para o novo número (-2), a sua representação binária será

110

em que 1 é o sinal e 10 o número.

Alto! Mas nós não podemos estender números negativos com 0, porque isso vai alterar o seu valor e o seu sinal!

Figura 4

Por essa razão, em complemento para 2, a extensão é feita com 0 se positivo e com 1 se negativo, isto é, com o valor do bit de ordem mais alta, ou seja, o sinal. Vamos exemplificar com a tabela da  Figura 4 em que vamos estender (+2) e (-2) a 8 bits, onde os dígitos a negrito representam o sinal, os dígitos sombreados a azul o número e os dígitos sombreados a amarelo a extensão.

Figura 5

Uma vez clarificada a a questão da Extensão Binária, podemos avançar com o cálculo do simétrico de 55.

Figura 6

Comecemos precisamente por fazer a sua extensão a 8 bits, o que podemos ver ilustrado na Figura 5, onde os dígitos a negrito representam o sinal, os dígitos sombreados a azul o número e os dígitos sombreados a amarelo a extensão.
Temos o número 55 convertido em binário e estendido a 8 bits. Vamos a gora negar os bits da sua representação binária e adicionar 1 ao resultado, conforme descrito na  Figura 6.

Figura 7

Finalmente vamos somar os dois para verificarmos que o resultado é 0. Para isso devemos ignorar bit para além dos 8 que tem o resultado, conforme se pode verificar na Figura 7.

Mas ignorado porquê?

Questão importante que vai dar muito que falar mais à frente. Tem a ver com o tratamento do excesso de uma operação em binário, isto é o Carry Out da última ordem de bits, a 8ª.

Para já vamos  prosseguir o nosso trabalho com a subtração.