🧮 Computational Mathematics

Inicio · Parte 01 — Aritmética computacional y representación numérica

025 — Enteros con signo y complemento a dos

basico-computacional clase 5 de 20 4 horas demostración twos_complement

En complemento a dos, el negativo de x es 2ⁿ − x, y por eso la resta se implementa con el mismo sumador que la suma.

Fórmulas

representación de −x en n bits = 2ⁿ − x
rango: [−2ⁿ⁻¹, 2ⁿ⁻¹ − 1]

Desarrollo

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».

Ejemplo trabajado

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

Qué calcula el laboratorio

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

Salidas del laboratorio (8)

Muestra de la ejecución real

{
  "ancho_bits": 8,
  "5": "00000101",
  "-5": "11111011",
  "suma_5_y_-5": "00000000",
  "decodifica_11111011": -5,
  "minimo_representable": -128
}

Errores comunes

Dónde se usa

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).

Idea rectora de la parte

Reproducibilidad numérica exige fijar orden de operaciones, no solo semillas.

Error a evitar

Suponer que la suma de floats es asociativa.

Conexión con IA

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.

Bibliografía de la clase

Archivos de la clase