En Rust, le casting de types (type casting) se fait à l'aide du mot-clé as. Cela effectue une conversion explicite d'un type à un autre :
let x: i32 = 10; let y: u8 = x as u8;
Rust ne réalise pas de conversions implicites (implicit cast), comme le fait C ou C++. Cela prévient de nombreuses erreurs liées à la perte de données ou à des débordements.
Particularités :
Dangers potentiels :
i32 à u8, si la valeur dépasse la plage, les bits supérieurs excédentaires sont simplement rejetés — cela peut entraîner un comportement inattendu.Exemple :
let big: u16 = 300; let small: u8 = big as u8; // small == 44, car 300 % 256 = 44
Que se passe-t-il si vous effectuez le casting d'un nombre négatif de type
i8vers le typeu8à l'aide du mot-cléas?
Réponse : La valeur ne provoque pas d'erreur de compilation ou de panique à l'exécution. Au lieu de cela, les bits de la valeur sont interprétés comme un nombre non signé :
let x: i8 = -1; let y: u8 = x as u8; // y == 255
Histoire
Dans une application financière, les données sur le montant des transferts étaient initialement stockées comme i32. Le développeur a décidé de les convertir en u32 sans vérification des limites, ce qui a conduit à un traitement incorrect des valeurs négatives — les montants devenaient soudainement de grands nombres positifs, passant la validation de la logique métier !
Histoire
Dans un jeu pour microcontrôleurs, le changement de niveaux d'accélération était calculé comme la différence entre deux valeurs de niveau : le résultat pouvait être négatif. Ils ont utilisé le casting as u8 pour arrondir le résultat, ignorant les débordements. En conséquence, les vitesses "se bloquaient" au niveau maximal, car les valeurs négatives étaient converties en grands nombres positifs à cause du comportement de wrap-around.
Histoire
Dans une application réseau, lors de la copie d'un tampon de données, la longueur était calculée comme une différence entre des pointeurs (usize), puis castée vers u32 à l'aide de as. Avec de grands volumes de mémoire (>4 Go), cela entraînait une troncature de la valeur, ce qui causait une coupure de données et des erreurs lors de l'envoi de gros fichiers.