RustIntermedio19 oct 2025
¡El Misterio del Entero que se Volvió Ciclista en Producción!
snippet.rust
fn main() {
let mut x: u8 = 250;
x = x + 10;
println!("El valor de x es: {}", x);
}¿Qué crees que imprime?
✅ Salida Esperada
El valor de x es: 260 (o al menos un error/panic consistente)⚠️ Salida Real
En modo Debug (`cargo run`):
thread 'main' panicked at 'attempt to add with overflow', src/main.rs:3:9
note: run with `RUST_BACK_TRACE=1` environment variable to display a backtrace
En modo Release (`cargo run --release`):
El valor de x es: 4¿Por qué pasa esto?
¡Prepárate para un giro inesperado! 🎢 Aquí tenemos un `u8` (un entero sin signo de 8 bits) que solo puede contener valores de 0 a 255. Cuando intentamos sumarle `10` a `250`, el resultado `260` se pasa de la raya.
En **modo Debug** (cuando corres `cargo run`), Rust es como ese amigo súper precavido 🕵️♂️. Detecta el **desbordamiento** (`overflow`) y dice "¡Alto ahí, vaquero!" con un `panic!`. Esto es genial porque te avisa del error en desarrollo.
Pero, ¡ay del **modo Release** (con `cargo run --release`)! Por optimización, Rust se pone el sombrero de "¡hazlo rápido y sin preguntar!" 🏎️ y permite el **comportamiento de "wrap-around" o módulo** (truncamiento). Es decir, `250 + 10 = 260`, pero como `u8` solo tiene 256 valores (0-255), `260` se convierte en `260 % 256 = 4`. ¡Es como si el número diera la vuelta al circuito y volviera al inicio! 🔄
Este es un clásico "¡Funciona en mi máquina (de desarrollo)!" que explota en producción. 💥
Conceptos relacionados
integer-overflowdebug-vs-releasenumerical-precision