En Rust, la conversión de tipos (type casting) se realiza mediante la palabra clave as. Esto realiza una conversión explícita de un tipo a otro:
let x: i32 = 10; let y: u8 = x as u8;
Rust no realiza conversiones implícitas (implicit cast), como hacen C o C++. Esto previene muchos errores relacionados con la pérdida de datos o desbordamientos.
Características:
Peligros potenciales:
i32 a u8, si el valor se sale del rango, se descartan simplemente los bits más significativos, lo que puede llevar a un comportamiento inesperado.Ejemplo:
let big: u16 = 300; let small: u8 = big as u8; // small == 44, ya que 300 % 256 = 44
¿Qué sucederá si se realiza la conversión de un número negativo del tipo
i8al tipou8usando la palabra claveas?
Respuesta: El valor no provoca un error de compilación ni un pánico en tiempo de ejecución. En su lugar, los bits del valor se interpretan como un número sin signo:
let x: i8 = -1; let y: u8 = x as u8; // y == 255
Historia
En una aplicación financiera, los datos sobre la cantidad de transferencias se almacenaban inicialmente como i32. Un desarrollador decidió convertirlos a u32 sin verificar los límites, lo que llevó a un manejo incorrecto de valores negativos: ¡las cantidades se convertían inesperadamente en grandes números positivos, pasando la validación de la lógica de negocio!
Historia
En un juego para microcontroladores, el cambio de niveles de aceleración se calculaba como la diferencia entre dos niveles: el resultado podría ser negativo. Se utilizó la conversión as u8 para redondear el resultado, ignorando los desbordamientos. Como resultado, las velocidades se "congelaban" en el nivel máximo, porque los valores negativos se convertían en grandes positivos debido al comportamiento wrap-around.
Historia
En una aplicación de red, al copiar un búfer de datos, la longitud se calculaba como la diferencia de punteros (usize), y luego se convertía a u32 usando as. Con grandes volúmenes de memoria (>4 GB), esto resultaba en la truncación del valor, lo que causaba la pérdida de datos y errores al transmitir un archivo grande.