In Rust erfolgt die Typumwandlung (Type Casting) mithilfe des Schlüsselworts as. Es führt eine explizite Umwandlung von einem Typ in einen anderen durch:
let x: i32 = 10; let y: u8 = x as u8;
Rust führt keine impliziten Umwandlungen (Implicit Cast) durch, wie zum Beispiel C oder C++. Dies verhindert viele Fehler, die mit Datenverlust oder Überläufen verbunden sind.
Besonderheiten:
Potenzielle Gefahren:
i32 in u8, wenn der Wert den Bereich überschreitet, werden die überflüssigen oberen Bits einfach verworfen - dies kann zu unerwartetem Verhalten führen.Beispiel:
let big: u16 = 300; let small: u8 = big as u8; // small == 44, da 300 % 256 = 44
Was passiert, wenn man eine negative Zahl vom Typ
i8mit dem Schlüsselwortasin den Typu8umwandelt?
Antwort: Der Wert löst keinen Compilerfehler oder eine Laufzeitpanik aus. Stattdessen werden die Bits des Wertes als nicht signierte Zahl interpretiert:
let x: i8 = -1; let y: u8 = x as u8; // y == 255
Geschichte
In einer Finanzanwendung wurden die Daten über Beträge von Überweisungen zunächst als i32 gespeichert. Der Entwickler entschied sich, sie ohne Grenzkontrolle in u32 umzuwandeln, was zu einer falschen Behandlung negativer Werte führte - die Beträge wurden unerwartet zu großen positiven Zahlen, die die Validierung der Geschäftslogik bestanden!
Geschichte
In einem Spiel für Mikrocontroller wurde der Wechsel der Beschleunigungsstufen als Differenz zwischen zwei Niveauwerten berechnet: Das Ergebnis konnte negativ sein. Es wurde die Umwandlung as u8 zur Rundung des Ergebnisses verwendet, wobei Überläufe ignoriert wurden. Infolgedessen „hingen“ die Geschwindigkeiten auf dem maximalen Niveau, da negative Werte wegen des Wrap-Around-Verhaltens in große positive Zahlen verwandelt wurden.
Geschichte
In einer Netzwerk-Anwendung wurde bei der Kopie eines Datenpuffers die Länge als Differenz zwischen Zeigern (usize) berechnet und dann mit as in u32 umgewandelt. Bei großen Speichergrößen (>4 GB) führte dies zu einer Beschnitt des Wertes, was Datenverlust und Fehler beim Übertragen großer Dateien verursachte.