Hasta ahora hemos hablado de números enteros positivos y sobre cómo se representan en nuestras máquinas. Sin embargo, a veces necesitamos trabajar también con números negativos. ¿Cómo se representan en los ordenadores?
Hemos visto que el número 1 se representa como 0001 en binario, el número 6 se representa como 0110, etc. El 0 se representa como todos ceros 0000. Una forma práctica de almacenar números negativos es mantener un bit “especial” que indique si el número es negativo. Sería 1 si el número es negativo y 0 en caso contrario. Así es como la mayoría de los ordenadores tratan los números negativos: tienen un bit especial al extremo izquierdo de la representación binaria que se pone en 1 si el número es negativo y en 0 si es positivo.
No obstante, hay algo más que simplemente contar con un bit inicial en 1 para indicar que el número es negativo. En la notación decimal (en nuestros números habituales como 4, 5, 10, 311, etc.), los números positivos y negativos se anulan mutuamente. Al sumar 6 y -6 obtenemos 0, y no debemos perder esta propiedad en binario. Entonces, si en binario sumamos 6 y -6, el resultado también debería ser 0.
Imagina que tenemos 4 bits para representar un número y 1 bit adicional para almacenar el signo. Por tanto, contamos con un total de 5 bits. De esta forma, 6 se representa como 00110, mientras que 0 se representa como 00000. La forma binaria de -6 debe ser la opuesta de 6 para que al sumarlas den 0. Adelantándonos un poco, -6 se representa como 11010. Por consiguiente, si sumamos 00110 y 11010 en binario, obtenemos 00000.
Para convertir un número de positivo a negativo (y viceversa) en binario, podemos usar un sencillo truco: invertir todos los bits (convertir todos los 0 en 1 y todos los 1 en 0) y luego sumar 1 al resultado.
x = 6 # 00110
x = ~x + 1 # Invierte todos los bits y suma 1 => -6
x = ~x + 1 # Invierte todos los bits y suma 1 => 6
z = 0 # 00000
z = ~z + 1 # Invierte y suma 1 => 0
z = ~z + 1 # Invierte y suma 1 => 0
z = ~z # -1 (todos los bits en 1 en la representación binaria)
z = ~z # 0 (todos los bits en 0 en la representación binaria)
Ten en cuenta que sumar en binario se realiza de la misma manera que en decimal, comenzando por el dígito menos significativo y avanzando hacia el más significativo (manejando el acarreo).
Según el lenguaje y la implementación, los ordenadores almacenan los números de diferentes maneras. Lenguajes como C++ y Java disponen de tipos distintos para distintos rangos de valores. El tipo int almacena enteros en 32 bits: 31 bits para el número y 1 bit delantero para el signo ⇒ los valores pueden ir desde -2,147,483,648 () hasta 2,147,483,647 (). Observa que los positivos llegan a uno menos, porque los positivos comienzan con un bit 0 y el primer número que empieza con 0 es el mismo 0 (todos ceros).
Desafío
En la tierra mágica del 7, todo está alineado de manera que guarde relación con el número 7. Por ello, en esta tierra los científicos informáticos han desarrollado un sistema en el que se almacenan los números binarios en 77 bits (tanto positivos como negativos).
Dada una cadena de bits b, se te pide calcular el valor negativo de ese número y representarlo en 77 bits.
Entrada
La entrada contiene una sola línea que representa la cadena de bits b (1 ≤ |b| ≤ 77). Puede representar tanto un número positivo como uno negativo.
Salida
La salida debe contener una sola línea que represente -b con una longitud de 77.