Se o tipo de dados for definido como um tipo assinado, haverá diferentes tipos de representação - principalmente a representação de magnitude assinada e a representação de complemento de dois.
Para uma representação de magnitude com sinal, sim, o bit de sinal foi armazenado como o bit mais significativo (MSB, ou seja, o bit mais à esquerda). MSB de 0 representa um valor positivo, enquanto 1 representa um valor negativo. Exemplo:
7 = 00000111
-7 = 10000111
Isso é simples e (relativamente) legível por humanos, no entanto, os tipos inteiros geralmente não são não mantidos dessa forma para dois problemas:
(1) Existem duas representações para zero, +0 e -0. Torna problemático comparar os números, pois cria um caso especial.
(2) Não é fácil fazer computação (tão simples quanto adicionar e subtrair). Adicionando dois números positivos, número positivo para número negativo, número negativo para número positivo e adicionando dois números negativos são quatro casos de uso diferentes. por exemplo. 7 + 6 é direto
1 Carry bit
7 = 00000111
6 = 00000110 (Logic for add)
.. ........
13 = 00001101
Ao calcular 7 + (-6) significa a lógica de subtração a ser usada no lugar
7 = 00000111
-6 = 10000110 (Logic for subtraction)
.. ........
1 = 00000001
A faixa para um número de 8 bits é portanto - (2 ^ 7) +1 a 2 ^ 7-1 (isto é, -127 a +127, com dois zeros +0 e -0). A representação de magnitude assinada é usada principalmente para manter os números flutuantes.
E isso leva à representação do complemento dos dois. Números positivos são representados da mesma forma que a representação de magnitude assinada. Alterar o bit de sinal leva duas etapas: (1) Inverta todos os bits (altere todos os 0 para 1 e 1 para 0) (2) Adicione um.
Exemplo, para obter a representação de -6, seguimos os passos abaixo
6 = 00000110
Invert all bits: 11111001
Add one: 11111010
Então -6 é representado como 11111010
. Com a representação do complemento de dois, você ainda pode ler o sinal do MSB; enquanto há apenas uma representação para zero: 00000000
.
É fácil fazer computação com números binários em representação de complemento de dois também - adicionar está adicionando. Vamos ver novamente como isso funciona para calcular 7 + (- 6):
1111111 Carry bit
7 = 00000111
-6 = 11111010 (Logic for add)
.. ........
1 = 00000001
O intervalo para um número de 8 bits é portanto - (2 ^ 7) a 2 ^ 7-1 (isto é, -128 a +127). Observe que o intervalo é diferente da representação de magnitude assinada.