¿Cómo se almacenan los valores con signo negativo?

13

Estaba viendo este video sobre los valores máximos y mínimos de enteros con signo.

Tomemos un ejemplo de un valor con signo positivo: 0000 0001 El primer bit denota que el número es positivo y los últimos 7 bits son el número mismo. Por lo tanto, se interpreta fácilmente como +1.

Ahora tome un ejemplo de un valor con signo negativo - 1000 0000 que resulta ser -8. De acuerdo, la computadora puede entender que es un valor negativo debido al primer bit, pero ¿cómo diablos entiende que 000 0000 significa -8?

En general, ¿cómo se almacenan / interpretan los valores con signo negativo en una computadora?

discutido
fuente
nl.wikipedia.org/wiki/Two%27s_complement es cómo se almacenan los números binarios en las computadoras.
Pieter B
@PieterB Quizás tu computadora. Y muchas otras personas. Por buenas razones! Pero no insinúes que es la única forma.
underscore_d
Como quieras. ¡Puedo pensar en al menos 256! formas de almacenar números binarios (8 bits) en computadoras. Sin embargo, la mayoría de ellos son increíblemente tontos.
Caleth
C no especifica, es en gran medida cómo el fabricante del chip decide representar los datos. C se compila en el código de máquina y se encarga de no redefinir cómo el chip almacena los números. Las mismas reglas se aplican a los números de coma flotante. Depende del fabricante del chip definir cómo se almacenan. La mayoría de los fabricantes de chips usan el complemento 2, pero estoy seguro de que hay excepciones.
Berin Loritsch

Respuestas:

29

El estándar C no exige ninguna forma particular de representar números con signo negativo.

En la mayoría de las implementaciones que es probable que encuentre, los enteros con signo negativo se almacenan en lo que se llama complemento de dos . La otra forma importante de almacenar números con signo negativo se llama complemento de uno .

El complemento de dos de un número de N bits xse define como 2^N - x. Por ejemplo, el complemento de dos de 8 bits 1es 2^8 - 1, o 1111 1111. El complemento de dos de 8 bits 8es 2^8 - 8, que en binario es 1111 1000. Esto también se puede calcular volteando los bits xy agregando uno. Por ejemplo:

 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

El complemento de uno de un número x de N bits se define como x con todos sus bits invertidos, básicamente.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

El complemento a dos tiene varias ventajas sobre el complemento a uno. Por ejemplo, no tiene el concepto de 'cero negativo', que por una buena razón es confuso para muchas personas. La suma, la multiplicación y la resta funcionan de la misma manera con enteros con signo implementados con dos complementados como lo hacen también con enteros sin signo.

Miles Rout
fuente
19

Existen tres métodos bien conocidos para representar valores negativos en binario:

  1. Magnitud con signo . Esto es lo más fácil de entender, porque funciona de la misma manera que estamos acostumbrados cuando se trata de valores decimales negativos: la primera posición (bit) representa el signo (0 para positivo, 1 para negativo), y los otros bits representan el número . Aunque es fácil de entender para nosotros, es difícil para las computadoras trabajar, especialmente cuando se hace aritmética con números negativos.
    En una magnitud con signo de 8 bits, el valor 8 se representa como 0 0001000 y -8 como 1 0001000.

  2. Complemento de uno . En esta representación, los números negativos se crean a partir del número positivo correspondiente volteando todos los bits y no solo el bit de signo. Esto facilita el trabajo con números negativos para una computadora, pero tiene la complicación de que hay dos representaciones distintas para +0 y -0. El volteo de todos los bits hace que esto sea más difícil de entender para los humanos.
    En el complemento de 8 bits, el valor 8 se representa como 00001000 y -8 como 11110111.

  3. Complemento de dos . Esta es la representación más común utilizada hoy en día para los enteros negativos porque es la forma más fácil de trabajar para las computadoras, pero también es la más difícil de entender para los humanos. Al comparar los patrones de bits utilizados para valores negativos entre el complemento de uno y el complemento de dos, se puede observar que el mismo patrón de bits en el complemento de dos codifica para el siguiente número más bajo. Por ejemplo, 11111111 representa -0 en el complemento de uno y -1 en el complemento de dos, y de manera similar para 10000000 (-127 vs -128).
    En el complemento dos de 8 bits, el valor 8 se representa como 00001000 y -8 como 11111000.

Bart van Ingen Schenau
fuente
8
La magnitud firmada también tiene dos ceros.
Jörg W Mittag
+1 por mencionar signo / magnitud. poco común e inconveniente (para CPU si no humanos), pero vale la pena saberlo.
underscore_d
Casi todos trabajamos con magnitud firmada, especialmente con números FP.
Paulo1205
2

Los enteros firmados se almacenan usando http://en.wikipedia.org/wiki/Two%27s%20complement

Entonces obtienes:

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

Básicamente es muy fácil contar, cuenta hasta la mitad del máximo del entero firmado. Haz un +1, hazlo negativo y comienza la cuenta atrás.

Pieter B
fuente