Você está confuso porque esqueceu que deve haver algo que distingue os números positivos dos negativos.
Digamos que você queira armazenar números não negativos em 8 bits.
-
00000000
é 0, -
00000001
é 1, -
00000010
é 2, -
00000011
é 3, -
00000100
é 4, - ...
-
11111111
é 255
Assim, você pode armazenar números no intervalo 0-255 em 8 bits. 255 = 2 8 - 1. (2 é a base do sistema binário, 8 é o número de bits, 1 é subtraído porque queremos contar 0 em)
Agora, digamos que você queira armazenar números negativos também. Como podemos conseguir isso? Podemos dedicar um bit por sinal. Se este bit for 0
, interpretamos outros 7 bits como um número positivo, caso contrário, como um número negativo. É melhor usar o bit mais significativo para sinal porque facilita algumas operações.
-
Abordagem trivial: Basta ler um número como está:
-
00000001
== 1 e10000001
== -1 -
01000010
== 66 e11000010
== -66 -
01111111
== 127 e11111111
== -127
-
-
Complemento de Ones: Para qualquer número
x
, negar sua representação binária resulta em representação binária de-x
. Isso significa que:-
00000001
== 1 e11111110
== -1 -
01000010
== 66 e10111101
== -66 -
01111111
== 127 e10000000
== -127
-
-
Complemento de dois: Para qualquer número
x
, negar sua representação binária e adicionar 1 gera uma representação binária de-x
. Isso significa que:-
00000001
== 1 e11111111
== -1 -
01000010
== 66 e10111110
== -66 -
01111111
== 127 e1000001
== -127 -
10000000
== -128
-
Por que dois complementam o melhor?
- Porque tem o intervalo mais amplo: -128 ... 127, enquanto a abordagem trivial e o complemento de ones tem -127 ... 127
- Zero está bem definido:
- No complemento de dois apenas
00000000
é zero - Na abordagem trivial, tanto
00000000
como10000000
são zero - No complemento de uns,
00000000
e11111111
são zero
- No complemento de dois apenas
- A adição e a subtração são idênticas às dos números não assinados, portanto, a CPU não precisa de instruções adicionais para adicionar números assinados.
Observe que, se dedicarmos o bit mais significativo ao bit de sinal, não poderemos converter o número em binário sem saber quantos bits serão necessários. Por exemplo, temos 4 bits, então o número -5 na abordagem trivial é 1101
, em 7 bits seria 1000101
. 0001101
(4-bit -5 preenchido com zeros até 7 bits) é na verdade 13 (o bit mais significativo é 0, então é positivo).
Eu não farei a lição de casa para você, mas posso dar dicas gerais:
Para converter -x
em N
bits em complemento de representação de dois:
- Converta
-x
em binário usando o complemento de dois. - Tecla esquerda com zeros até
N-1
length. - Adicione o bit de sinal negativo no lado esquerdo.
Eu acho que você pode descobrir o resto dessa resposta. Se você tiver mais alguma dúvida, deixe um comentário.