Inicio · Parte 01 — Aritmética computacional y representación numérica
resultado = (a + b) mod 2ⁿ, reinterpretado con signo
int8: 127 + 1 = −128
El desbordamiento en enteros de ancho fijo es silencioso por diseño: el hardware calcula módulo 2ⁿ y descarta los bits que sobran. No hay excepción, no hay aviso, y el programa continúa con un valor que puede tener el signo contrario al esperado. Es una de las pocas situaciones en computación donde un error grave no produce ninguna señal.
Python es la excepción cómoda: sus enteros crecen indefinidamente, limitados solo por la memoria. Esa comodidad esconde el problema hasta que el mismo cálculo pasa a NumPy (donde int32 sí desborda), a una base de datos, a un servicio en otro lenguaje o a un modelo cuantizado. La lección de esta clase es que la ausencia de desbordamiento en Python no es una propiedad del algoritmo: es una propiedad del intérprete.
Los casos históricos abundan. El vuelo inaugural del Ariane 5 en 1996 se destruyó por una conversión de un flotante de 64 bits a un entero con signo de 16 bits cuyo valor no cabía. El «problema del año 2038» es el desbordamiento de un time_t de 32 bits contando segundos desde 1970.
La defensa práctica tiene tres capas: elegir el ancho con margen sobre el rango real, validar los límites en las fronteras del sistema, y usar tipos con detección de desbordamiento donde el lenguaje los ofrezca (checked_add en Rust, -ftrapv en C).
Wraparound en int8 simulado sobre Python.
máximo int8 127
127 + 1 → wraparound −128 (no 128)
127 + 2 → wraparound −127
En Python nativo:
127 + 1 = 128 (int ilimitado)
sys.maxsize = 9223372036854775807 (tamaño del puntero, no un límite del int)
Lección: Python no desborda, C y NumPy sí.
El algoritmo es el mismo; el resultado, no.
Wraparound en enteros de ancho fijo simulado sobre Python.
python classes/part-01-aritmetica-computacional-y-representacion-numerica/026-rango-overflow-y-wraparound/lab.py
compmath run 026
maximo_int8maximo+1_con_wraparoundmaximo+2_con_wraparoundpython_int_es_ilimitadosys_maxsizeleccion{
"maximo_int8": 127,
"maximo+1_con_wraparound": -128,
"maximo+2_con_wraparound": -127,
"python_int_es_ilimitado": 128,
"sys_maxsize": 9223372036854775807,
"leccion": "Python no desborda, C/NumPy sí"
}
Contadores, marcas de tiempo, identificadores, acumuladores de métricas y cualquier dato que cruza la frontera entre Python y un sistema de ancho fijo. Es una categoría reconocida de vulnerabilidad de seguridad.
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.