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?
c
memory
bitwise-operators
bit
discutido
fonte
fonte
Respostas:
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 como2^N - x
. Por exemplo, o complemento de 8 bits dos dois1
é2^8 - 1
ou1111 1111
. O complemento de 8 bits para dois8
é o2^8 - 8
que é binário1111 1000
. Isso também pode ser calculado invertendo os bitsx
e adicionando um. Por exemplo:O complemento de um número de N bits x é definido como x com todos os seus bits invertidos, basicamente.
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.
fonte
Existem três métodos conhecidos para representar valores negativos em binário:
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.
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.
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.
fonte
Os números inteiros assinados são armazenados usando http://en.wikipedia.org/wiki/Two%27s%20complement
Então você obtém:
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.
fonte