Este artículo analiza los sistemas de tipos enteros en los lenguajes de programación más extendidos y defiende el enfoque de Rust como modelo más riguroso. El autor repasa cómo C, C#, Go y Swift manejan los enteros: en C, el desbordamiento de enteros con signo es comportamiento indefinido y conviven tipos de tamaño fijo con otros dependientes de la máquina; C# y Go ofrecen enteros con tamaño explícito, pero mantienen un sesgo hacia el tipo int con signo y usan enteros con signo para índices y tamaños; Swift, por su parte, aborta el programa en caso de desbordamiento incluso en compilaciones de producción. Frente a este panorama, Rust elimina la ambigüedad: todos los tipos enteros tienen un tamaño explícito (i8, u8, u16, u32, u64, usize, isize), no hay sesgo hacia un tamaño o signo determinado, se usan usize/isize para tamaños e índices, y el desbordamiento provoca un pánico en modo depuración y un wrap en modo release, sin comportamiento indefinido. El autor reconoce que Rust aplica i32 por defecto a literales sin información de tipo, pero valora la igualdad entre enteros con y sin signo. También examina por qué el desbordamiento con signo es UB en C: argumenta que, aunque las CPU modernas suelen envolver los enteros, esa envoltura no siempre es gratuita, y muestra un ejemplo de Chandler Carruth en el que usar enteros sin signo obliga al compilador a emitir instrucciones extra para preservar la semántica de wrap. Concluye recomendando usar enteros con signo cuando se trate de cantidades aritméticas y dejar los sin signo para casos modulares.
Reflexiones sobre los tipos enteros en los lenguajes de programación
Fuentes:
Thoughts On Integers
