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