Inicio · Parte 01 — Aritmética computacional y representación numérica
representación de −x en n bits = 2ⁿ − x
rango: [−2ⁿ⁻¹, 2ⁿ⁻¹ − 1]
La razón por la que existe el complemento a dos es de ingeniería, no de matemáticas: permite que un único circuito sumador maneje positivos y negativos sin casos especiales. Si −x se representa como 2ⁿ − x, entonces a + (−b) calculado módulo 2ⁿ da exactamente a − b cuando el resultado está en rango. La resta desaparece como operación separada.
Las alternativas históricas —signo-magnitud y complemento a uno— tenían dos representaciones para el cero (+0 y −0), lo que obliga a casos especiales en las comparaciones. El complemento a dos tiene un único cero, y como contrapartida un rango asimétrico: en 8 bits va de −128 a +127, un negativo más que positivos.
Esa asimetría no es una curiosidad. abs(-128) en un int8 no es representable, así que desborda; en NumPy, np.abs(np.int8(-128)) devuelve −128 sin avisar. El mismo fenómeno afecta a -x y a la división x // -1. Es una fuente real de errores en código que procesa datos de sensores o audio en enteros.
El bit más significativo actúa como bit de signo, pero no es «un bit de signo» en el sentido de signo-magnitud: su peso es −2ⁿ⁻¹. Interpretar 11111011 como número requiere −128 + 64 + 32 + 16 + 8 + 2 + 1 = −5, no «signo negativo y magnitud 123».
Representación en 8 bits y suma con signos opuestos.
+5 = 00000101
−5 = 2⁸ − 5 = 251 = 11111011
Suma 5 + (−5):
00000101
+ 11111011
-----------
100000000 → se descarta el noveno bit (módulo 2⁸)
00000000 = 0 ✓
Decodificar 11111011:
−128 + 64 + 32 + 16 + 8 + 0 + 2 + 1 = −5 ✓
Rango: mínimo −128, máximo +127
Asimetría: |−128| = 128 NO es representable en int8
Representación de negativos en 8 bits.
python classes/part-01-aritmetica-computacional-y-representacion-numerica/025-enteros-con-signo-y-complemento-a-dos/lab.py
compmath run 025
ancho_bits5-5suma_5_y_-5decodifica_11111011minimo_representablemaximo_representableasimetria{
"ancho_bits": 8,
"5": "00000101",
"-5": "11111011",
"suma_5_y_-5": "00000000",
"decodifica_11111011": -5,
"minimo_representable": -128
}
Todo entero con signo en C, Rust, Java, NumPy y bases de datos. Los errores de desbordamiento por complemento a dos son una categoría reconocida de vulnerabilidad (CWE-190).
float32, bfloat16 y la cuantización a int8 son decisiones de representación. Los NaN en un entrenamiento casi siempre nacen aquí, no en la arquitectura.
9780128203316 verificado en International ISBN Agency (2026-08-19).