In Rust vindt typecasting plaats met behulp van het trefwoord as. Dit voert een expliciete conversie van het ene type naar het andere uit:
let x: i32 = 10; let y: u8 = x as u8;
Rust voert geen impliciete conversies uit, zoals bijvoorbeeld C of C++. Dit voorkomt veel fouten die verband houden met dataverlies of overloop.
Bijzonderheden:
Potentiële gevaren:
i32 naar u8, als de waarde buiten het bereik valt, worden de extra hogere bits eenvoudigweg weggegooid — dit kan leiden tot onverwacht gedrag.Voorbeeld:
let big: u16 = 300; let small: u8 = big as u8; // small == 44, omdat 300 % 256 = 44
Wat gebeurt er als je een negatief nummer van type
i8naar typeu8converteert met behulp van het trefwoordas?
Antwoord: De waarde veroorzaakt geen compilatiefout of runtime paniek. In plaats daarvan worden de bits van de waarde geïnterpreteerd als een ongetekend nummer:
let x: i8 = -1; let y: u8 = x as u8; // y == 255
Verhaal
In een financiële applicatie werden gegevens over het bedrag van overdrachten aanvankelijk opgeslagen als i32. Een ontwikkelaar besloot deze om te zetten naar u32 zonder grenscontrolen, wat leidde tot verkeerde verwerking van negatieve waarden — bedragen werden onverwacht grote positieve getallen en doorstonden de validatie van de bedrijfslogica!
Verhaal
In een spel voor microcontrollers werd de versnelling berekend als het verschil tussen twee niveau waarden: het resultaat kon negatief zijn. Er werd as u8 gebruikt voor het afronden van het resultaat, waarbij overlopen werd genegeerd. Hierdoor "bleven" snelheden vastzitten op het maximale niveau, omdat negatieve waarden werden omgezet in grote positieve door wrap-around gedrag.
Verhaal
In een netwerkapplicatie werd de lengte van een gegevensbuffer berekend als het verschil tussen pointers (usize), en daarna naar u32 geconverteerd met as. Bij grote geheugenhoeveelheden (>4 GB) leidde dit tot truncatie van waarden, wat resulteerde in dataverlies en fouten bij het verzenden van grote bestanden.