Qué es el complemento a 2 y por qué lo usan los ordenadores
La forma estándar de guardar números negativos en binario, explicada desde cero y con ejemplos resueltos.
This guide is currently available in Spanish only. Your browser can translate it automatically.
El problema: el binario no tiene signo menos
En papel escribimos −5 poniendo un signo delante, pero un ordenador solo tiene ceros y unos. Hace falta una convención para decidir qué combinaciones de bits representan números negativos. Se probaron varias ideas y la que ganó, y la que usan prácticamente todos los procesadores actuales, es el complemento a 2.
La primera idea (y por qué no funcionó bien)
Lo más intuitivo sería reservar el primer bit para el signo (0 positivo, 1 negativo) y usar el resto para el valor. Es el sistema llamado signo y magnitud. Tiene dos problemas: existen dos ceros distintos (+0 y −0), y sumar un positivo con un negativo exige circuitos especiales. El complemento a 2 resuelve ambos.
Cómo se calcula, paso a paso
Para escribir un número negativo −N con un número fijo de bits:
- Escribe N (en positivo) en binario, rellenando con ceros a la izquierda hasta completar los bits.
- Invierte todos los bits.
- Suma 1.
Ejemplo: −20 con 8 bits
- 20 =
00010100 - Invertido:
11101011 - Más 1:
11101100
Así que −20 en complemento a 2 de 8 bits es 11101100. Los números positivos no cambian: 20 sigue siendo 00010100.
Cómo leer un binario con signo
Si el primer bit es 0, el número es positivo y se lee normal. Si es 1, es negativo. Para saber su valor tienes dos opciones:
- Repetir la receta: invertir y sumar 1 te devuelve el valor positivo. De
11101100→00010011→00010100= 20, así que el número era −20. - Usar un peso negativo: el primer bit vale −128 (en 8 bits) en lugar de +128. Entonces 11101100 = −128 + 64 + 32 + 8 + 4 = −20.
Por qué es tan buena idea
La gran ventaja es que la suma funciona igual para todos. Sumemos 20 + (−20) en 8 bits:
00010100 + 11101100 = 1 00000000
El 1 que sale por la izquierda (el acarreo) se descarta porque no cabe en 8 bits, y el resultado es exactamente 0. El procesador no necesita saber si los números eran positivos o negativos: usa el mismo circuito sumador. Además, solo existe un cero.
Rangos y desbordamiento
Con n bits se pueden representar los números de −2ⁿ⁻¹ a 2ⁿ⁻¹ − 1:
| Bits | Mínimo | Máximo |
|---|---|---|
| 8 | −128 | 127 |
| 16 | −32.768 | 32.767 |
| 32 | −2.147.483.648 | 2.147.483.647 |
Si una operación da un resultado fuera de ese rango se produce un desbordamiento (overflow). Por ejemplo, en 8 bits 127 + 1 da 10000000, que se interpreta como −128. Este tipo de error ha causado fallos reales en programas y videojuegos, y es la razón de que en programación haya que elegir bien el tamaño de las variables.