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
00000000como10000000são zero - No complemento de uns,
00000000e11111111sã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
-xem binário usando o complemento de dois. - Tecla esquerda com zeros até
N-1length. - 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.