Como os valores assinados negativos são armazenados?


12

Eu estava assistindo este vídeo sobre os valores máximo e mínimo de números inteiros assinados.

Tomemos um exemplo de um valor assinado positivo - 0000 0001 O primeiro bit indica que o número é positivo e os últimos 7 bits são o próprio número. Portanto, é facilmente interpretado como +1.

Agora, pegue um exemplo de um valor assinado negativo - 1000 0000, que passa a ser -8. Ok, o computador pode entender que é um valor negativo por causa do primeiro bit, mas como diabos ele entende que 000 0000 significa -8?

Em geral, como os valores assinados negativos são armazenados / interpretados em um computador?


nl.wikipedia.org/wiki/Two%27s_complement é como o número binário é armazenado nos computadores.
Pieter B

@ PieterB Talvez o seu computador. E muitas outras pessoas. Por boas razões! Mas não insinue que é o único caminho.
underscore_d

Como você quiser. Eu posso pensar em pelo menos 256! maneiras de armazenar números binários (8 bits) em computadores. No entanto, a maioria deles é incrivelmente boba.
Caleth 19/02/19

C não especifica, é basicamente como o fabricante do chip decide representar os dados. C é compilado no código da máquina e toma cuidado para não redefinir como o chip armazena números. As mesmas regras se aplicam aos números de ponto flutuante. Cabe ao fabricante do chip definir como eles são armazenados. A maioria dos fabricantes de chips usa o complemento 2, mas tenho certeza de que há exceções.
Berin Loritsch

Respostas:


28

O padrão C não exige nenhuma maneira específica de representar números assinados negativos.

Na maioria das implementações que você provavelmente encontrará, números inteiros negativos assinados são armazenados no que é chamado de complemento de dois . A outra maneira principal de armazenar números negativos assinados é chamada de complemento .

O complemento de dois de um número de N bits xé definido como 2^N - x. Por exemplo, o complemento de 8 bits dos dois 1é 2^8 - 1ou 1111 1111. O complemento de 8 bits para dois 8é o 2^8 - 8que é binário 1111 1000. Isso também pode ser calculado invertendo os bits xe adicionando um. Por exemplo:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

O complemento de um número de N bits x é definido como x com todos os seus bits invertidos, basicamente.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

O complemento de dois tem várias vantagens sobre o complemento de alguém. Por exemplo, ele não tem o conceito de 'zero negativo', o que por um bom motivo é confuso para muitas pessoas. A adição, multiplicação e subtração funcionam da mesma maneira com números inteiros assinados implementados com dois complementados, assim como com números inteiros não assinados.


18

Existem três métodos conhecidos para representar valores negativos em binário:

  1. Magnitude assinada . É mais fácil de entender, porque funciona da mesma maneira que estamos acostumados a lidar com valores decimais negativos: A primeira posição (bit) representa o sinal (0 para positivo, 1 para negativo) e os outros bits representam o número . Embora seja fácil entendermos, é difícil para os computadores trabalharem, principalmente ao fazer aritmética com números negativos.
    Na magnitude assinada de 8 bits, o valor 8 é representado como 0 0001000 e -8 como 1 0001000.

  2. Um complemento . Nesta representação, números negativos são criados a partir do número positivo correspondente, invertendo todos os bits e não apenas o bit de sinal. Isso facilita o trabalho com números negativos para um computador, mas tem a complicação de que existem duas representações distintas para +0 e -0. O movimento de todos os bits torna isso mais difícil de entender para os seres humanos.
    No complemento de 8 bits, o valor 8 é representado como 00001000 e -8 como 11110111.

  3. Complemento de dois . Essa é a representação mais comum atualmente usada para números inteiros negativos, porque é a mais fácil de trabalhar para computadores, mas também é a mais difícil de entender para humanos. Ao comparar os padrões de bits usados ​​para valores negativos entre o complemento de alguém e o complemento de dois, pode-se observar que o mesmo padrão de bit no complemento de dois codifica para o próximo número mais baixo. Por exemplo, 11111111 significa -0 no complemento de alguém e -1 no complemento de dois e, da mesma forma, 10000000 (-127 vs -128).
    No complemento de dois bits de 8 bits, o valor 8 é representado como 00001000 e -8 como 11111000.


8
A magnitude assinada também possui dois zeros.
Jörg W Mittag

+1 por mencionar sinal / magnitude. incomum e inconveniente (para CPUs, se não humanos!), mas vale a pena conhecer.
underscore_d

Quase todos nós trabalhamos com magnitude assinada, especialmente com números FP.
Paulo1205 12/12

2

Os números inteiros assinados são armazenados usando http://en.wikipedia.org/wiki/Two%27s%20complement

Então você obtém:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

Basicamente, é muito fácil contar, você conta até a metade do máximo do número inteiro assinado. Faça um +1, faça negativo e comece a contagem regressiva.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.