Datentypen
Verständnis
Die Bitbreite der Zahlentypen isize und usize hängt von der 32- oder 64-Bit-Architektur des laufenden Systems ab.
Im Debug-Modus führt ein Integer-Überlauf zu einem Panic; im Release-Modus nicht.
wrapping_* löst auch im Debug-Modus keinen Panic aus.
checked_* gibt bei einem Überlauf None zurück.
overflowing_* gibt einen booleschen Wert zurück, der anzeigt, ob ein Überlauf aufgetreten ist.
saturating_* begrenzt den Wert bei einem Überlauf auf den Minimal- oder Maximalwert.
Tupel:
let tup: (i32, f64, u8) = (500, 6.4, 1);
let tup = (500, 6.4, 1);
let (x, y, z) = tup; // Destrukturierende Zuweisung
let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0;
let six_point_four = x.1;
let one = x.2;
Arrays:
let a = [1, 2, 3, 4, 5];
let a: [i32; 5] = [1, 2, 3, 4, 5];
let a = [0; 5]; // Schnelle Initialisierung
let a = [[0, 5]; 20]; // Zweidimensionales Array
Quelle
Skalare Typen
…
Integer-Typen
Außerdem hängen die Typen isize und usize von dem Computer ab, auf dem das Programm läuft: 64 Bit bei einer 64-Bit-Architektur und 32 Bit bei einer 32-Bit-Architektur.
…
Integer-Überlauf
Angenommen, eine Variable vom Typ u8 kann Werte zwischen 0 und 255 aufnehmen. Wenn wir sie auf einen Wert außerhalb dieses Bereichs ändern, etwa 256, tritt ein Integer-Überlauf auf. Rust hat dafür einige besondere Regeln. Beim Kompilieren im Debug-Modus enthält Rust Prüfungen auf Integer-Überlauf, die zur Laufzeit einen Panic auslösen. Rust bezeichnet das Beenden eines Programms mit einem Fehler als Panic; ausführlicher wird das im Abschnitt
„Unwiederbringliche Fehler mit panic!“
in Kapitel 9 behandelt.
Beim Kompilieren im Release-Modus mit dem Flag --release enthält Rust keine Prüfungen, die bei Integer-Überlauf einen Panic auslösen. Stattdessen führt Rust bei einem Überlauf ein Zweierkomplement-Wrapping aus. Kurz gesagt: Werte über dem maximal darstellbaren Wert „springen“ zum Minimalwert des Typs zurück. Bei u8 wird 256 zu 0, 257 zu 1 und so weiter. Das Programm löst keinen Panic aus, aber die Variable hat wahrscheinlich nicht den erwarteten Wert. Sich auf dieses Wrapping-Verhalten zu verlassen, gilt als Fehler.
Um Überläufe ausdrücklich zu behandeln, kann man die folgenden Methodenfamilien verwenden, die die Standardbibliothek für primitive Zahlentypen bereitstellt:
- In allen Modi wrappen mit Methoden wie
wrapping_add. - Bei einem Überlauf den Wert
Nonezurückgeben mit denchecked_*-Methoden. - Den Wert und einen booleschen Wert zurückgeben, der einen Überlauf anzeigt, mit den
overflowing_*-Methoden. - Auf den Minimal- oder Maximalwert begrenzen mit den
saturating_*-Methoden.