¿Por qué el valor mínimo de ints, dobles, etc. 1 está más lejos de cero que el valor positivo?

10

Sé que tiene algo que ver con el complemento de 2 y sumar 1, pero realmente no entiendo cómo puedes codificar un número más con la misma cantidad de bits cuando se trata de números negativos.

recortes de papel
fuente
3
La parte realmente desagradable de esto es que Abs (MinValue) es negativo.
OldFart
1
en java Double.MIN_VALUE es el valor positivo más pequeño , y los números (reales) más alejados de cero tienen la misma magnitud (ya que tiene un bit de signo apropiado)
monstruo de trinquete

Respuestas:

16

Piénsalo en estos términos. Tome un número de 2 bits con un signo anterior:

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

Ahora tengamos algunos aspectos negativos:

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

Espera, también tenemos

100 ... 

Tiene que ser negativo, porque el bit de signo es 1. Entonces, lógicamente, debe ser -4.

(Editar: como WorldEngineer señala correctamente , no todos los sistemas de numeración funcionan de esta manera, pero los que está preguntando lo hacen).

pdr
fuente
11

Porque no hay dos clases de números en el rango entero, sino tres: números negativos, cero y números positivos. El cero debe ocupar un espacio (sería poco práctico no poder representar el cero ...), por lo que la clase positiva o negativa tiene que abandonar un espacio. El hecho de que generalmente sea el rango positivo que tiene que hacer ese sacrificio es hasta cierto punto arbitrario, pero en el nivel de las manipulaciones de bits hay algunas cosas que esta decisión hace más conveniente.

Kilian Foth
fuente
No se trata solo de pequeñas manipulaciones. El conjunto de números con signo de 32 bits es el conjunto de números cuya representación binaria tiene el mismo valor en todos los bits después del 31, y uno de esos números tiene un conjunto infinito de unos seguidos de 31 ceros. El inverso aditivo de ese número, una cadena infinita de ceros seguida de un solo 1 y 31 ceros, no se ajusta al patrón requerido de los valores con signo.
supercat
4

BÁSICAMENTE hay tres formas de representar enteros con signo en binario: complemento de 2, complemento de 1 y magnitud de signo. (Biquinary siguió el camino del Dodo Bird hace mucho tiempo).

El complemento de 1 y la magnitud de signo tienen dos valores cero, +0 y -0, cada uno con una representación única. El complemento de 2 solo tiene un valor cero y una representación.

Ahora, un campo de N bits puede codificar 2 ^ N valores. Resta uno en el complemento de 2, y tienes 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Dado que la representación para cero es todos bits cero, y un signo + es cero, habrá una posible representación distinta de cero con el bit de signo establecido en 1.

Esta es una forma muy larga de decir que el complemento de 2 representa valores en el rango - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).

El complemento de 1 en realidad tiene una ventaja sobre el complemento de 2 si está haciendo cálculos de procesamiento de señal digital entera. Las operaciones complementarias de 1 se truncan inherentemente hacia cero. El complemento de 2 se trunca hacia el infinito. Aprendí este de la manera DURA ...

John R. Strohm
fuente