Rust - Grundlagen - 02 - Datentypen

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

https://doc.rust-lang.org/book/ch03-02-data-types.html

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 None zurückgeben mit den checked_*-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.