En el artículo anterior hemos visto cómo representar números enteros positivos (que era bastante fácil). Ahora vamos a ver cómo representar números enteros negativos, que tiene un poco “más de miga”.
En binario, normalmente representamos los números binarios en complemento a 2. Es una técnica que simplifica los cálculos al trabajar con números negativos (aunque resulta algo más complicada de entender para los humanos).
Pero, en lugar de simplemente explicar lo que es el complemento a 2, vamos a intentar razonar porqué empleamos este sistema, y cómo se llego a esta representación.
Se viene explicación “tocha” de cómo surgió el sistema de complemento a 2
Si no te interesa, y solo quieres ver como funciona, salta al siguiente apartado
Representando números negativos en binario
Supongamos que estamos “inventando” cómo representar números negativos en binario. Vamos a ver los pasos lógicos por los que acabaríamos llegando al complemento a 2.
Intento A: Un bit para el signo
Lo primero que se nos ocurre es, “vamos a usar el bit más de la izquierda para indicar que un número es negativo”.
El resto lo dejamos igual. Los otros bits serán iguales para el positivo y el negativo. Así que, en 4 bits, -3 a 3 quedaría así.
Signo | Bit1 | Bit2 | Bit3 | Decimal |
---|---|---|---|---|
0 | 0 | 1 | 1 | 3 |
0 | 0 | 1 | 0 | 2 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | -1 |
1 | 0 | 0 | 1 | -2 |
1 | 0 | 1 | 0 | -3 |
Vale, muy fácil de entender. Pero si sumamos -3 y 3… nos sale -6.
Signo | Bit1 | Bit2 | Bit3 | Decimal | |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 3 | |
+ | 1 | 0 | 1 | 0 | -3 |
= | 1 | 1 | 0 | 1 | -6 |
Con este primer intento hemos hecho algo que se entiende bastante bien por los humanos, pero que complica mucho los cálculos. Así que vamos a darle una vuelta.
Intento B: Complemento a 1
Lo del bit para el signo ha salido bien. Además, tampoco tenemos otro remedio. Para el resto, vamos a probar una cosa, vamos a invertir los bits de los números negativos.
Así, los números de -3 a 3 quedarían así.
Signo | Bit1 | Bit2 | Bit3 | Decimal |
---|---|---|---|---|
0 | 0 | 1 | 1 | 3 |
0 | 0 | 1 | 0 | 2 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | -0 |
1 | 1 | 1 | 0 | -1 |
1 | 1 | 0 | 1 | -2 |
1 | 1 | 0 | 0 | -3 |
Ahora, si los sumamos, este es el resultado.
Signo | Bit1 | Bit2 | Bit3 | Decimal | |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 3 | |
+ | 1 | 1 | 0 | 0 | -3 |
= | 1 | 1 | 1 | 1 | -0 |
Vale, hemos mejorado… lo de invertir los números ha sido un buen “truco”, porque bit a bit el positivo y el negativo se cancelan, dando como resultado todo 1’s, que hemos dicho que es un 0.
Pero tío ¡Ahora tenemos 2 ceros distintos! Tenemos +0 y -0. Y además, la suma da -0, no 0.
Eso es un poco raro. A la larga, seguro que nos va a dar problemas. Así que vamos a darle una vuelta a ver si lo arreglamos.
Bingo!: Complemento a 2
Ya llegamos a la definitiva. Hacemos lo mismo
- Bit para el signo
- Números negativos negados
- Además, a los negativos les sumamos ‘1’
Así quedarían los números de -3 a 3.
Signo | Bit1 | Bit2 | Bit3 | Decimal |
---|---|---|---|---|
0 | 0 | 1 | 1 | 3 |
0 | 0 | 1 | 0 | 2 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | -1 |
1 | 1 | 1 | 0 | -2 |
1 | 1 | 0 | 1 | -3 |
Ahora sumamos -3 y 3 y…
Signo | Bit1 | Bit2 | Bit3 | Decimal | |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 3 | |
+ | 1 | 1 | 0 | 1 | -3 |
= | 0 | 0 | 0 | 0 | 0 |
¡Bingo! Da 0. No -0 o alguna cosa rara. Da cero, solo un cero.
Igual que antes, al invertir los números negativos provocamos que al sumar un negativo y un positivo se “acoplan” dando una secuencia de todo 1’s.
Pero, además, como ahora le sumamos un 1 de más (que lleva el número negativo), todos esos 1’s desbordan y se convierte en cero. Y por eso, usamos el complemento a 2.
Por último, y si os lo estabais preguntando, el complemento a 2, del complemento a 2 de un número, es el propio número. Es decir -(-3) = 3. Bien, se agradece, pero también pasaba con el resto de ejemplos.
Tu amigo el complemento a 2
Resumen de todo lo que hemos visto, el complemento a 2 es una forma de representación de números negativos en sistema binario.
A primera impresión parece complicado, pero se usa mucho porque nos permite operar con números negativos de forma sencilla (facilita mucho las cuentas).
Si queremos convertir un número positivo en negativo, en representación en sistema binario en complemento a 2:
- Ponemos a
1
el bit de la izquierda, que representa el signo - Invertimos el resto de bits
- Le sumamos 1 a lo anterior
¿Cuánto vale un número binario?
Vuelvo a esto, porque es una cosa con la que se lía mucho la gente. Cuanto vale un número binario. Imaginamos que tienes este número:
10011001
¿Cuánto vale este número?
- Algunos me diréis 153
- Otros me diréis que -103
¿Cómo puede ser? Porque un número binario no representa nada, si no me dices qué sistema usa para representarlo.
La representación binaria es la misma. Pero el número que representan NO es el mismo
Para saber qué número es, necesito que digas que estás representando, un entero, un entero con negativos, si es un flotante.