Por que o valor mínimo de ints, dobras, etc 1 está mais longe de zero que o valor positivo?


10

Eu sei que tem algo a ver com o complemento de 2 e a adição de 1, mas eu realmente não entendo como você pode codificar mais um número com a mesma quantidade de bits quando se trata de números negativos.


3
A parte realmente desagradável disso é que o Abs (MinValue) é negativo.
precisa saber é o seguinte

11
em java Double.MIN_VALUE é o menor positivo valor, e os (reais) números mais distantes de zero têm igual magnitude (como ele tem um pouco adequada sinal)
aberração catraca

Respostas:


16

Pense nisso nesses termos. Pegue um número de 2 bits com um sinal anterior:

000 = 0
001 = 1
010 = 2
011 = 3

Agora vamos ter alguns pontos negativos:

111 = -1
110 = -2
101 = -3

Espere, nós também temos

100 ... 

Tem que ser negativo, porque o bit de sinal é 1. Portanto, logicamente, deve ser -4.

(Editar: Como o WorldEngineer aponta corretamente , nem todos os sistemas de numeração funcionam dessa maneira - mas os que você está perguntando).


11

Porque não há duas classes de números no intervalo inteiro, mas três: números negativos, zero e números positivos. O zero precisa ocupar um espaço (seria impraticável não poder representar zero ...); portanto, a classe positiva ou a negativa tem que abrir mão de um espaço. O fato de que geralmente é o intervalo positivo que deve fazer esse sacrifício é, em certa medida, arbitrário, mas no nível de manipulação de bits, há algumas coisas que essa decisão torna mais conveniente.


Não são apenas pequenas manipulações. O conjunto de números assinados de 32 bits é o conjunto de números cuja representação binária tem o mesmo valor em todos os bits após o dia 31, e um desses números possui um conjunto infinito de números seguidos por 31 zeros. O inverso aditivo desse número, uma sequência infinita de zeros seguida por um único 1 e 31 zeros, não se encaixa no padrão exigido dos valores assinados.
Supercat

4

Existem basicamente três maneiras de representar números inteiros assinados em binário: complemento de 2, complemento de 1 e magnitude de sinal. (A Biquinary seguiu o caminho do Pássaro Dodo há muito tempo.)

O complemento 1 e a magnitude do sinal têm dois valores zero, +0 e -0, cada um com uma representação única. O complemento 2 tem apenas um valor zero e uma representação.

Agora, um campo de N bits pode codificar valores de 2 ^ N. Subtraia um no complemento de 2 e você tem 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Como a representação para zero é todos os bits zero, e um sinal + é zero, haverá mais uma representação diferente de zero possível com o bit de sinal definido como 1.

Essa é uma maneira muito longa de dizer que o complemento de 2 representa valores no intervalo - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).

O complemento de 1 na verdade tem uma vantagem sobre o complemento de 2 se você estiver executando cálculos de processamento de sinal digital inteiro. As operações de complemento de 1 truncam inerentemente para zero. O complemento de 2 trunca em direção ao infinito. Eu aprendi este da maneira DURA ...

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.