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?
c
memory
bitwise-operators
bit
discutido
fuente
fuente
Respuestas:
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
x
se define como2^N - x
. Por ejemplo, el complemento de dos de 8 bits1
es2^8 - 1
, o1111 1111
. El complemento de dos de 8 bits8
es2^8 - 8
, que en binario es1111 1000
. Esto también se puede calcular volteando los bitsx
y agregando uno. Por ejemplo:El complemento de uno de un número x de N bits se define como x con todos sus bits invertidos, básicamente.
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.
fuente
Existen tres métodos bien conocidos para representar valores negativos en binario:
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.
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.
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.
fuente
Los enteros firmados se almacenan usando http://en.wikipedia.org/wiki/Two%27s%20complement
Entonces obtienes:
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.
fuente