Tracks
/
Rust
Rust
/
Lehrplan
/
Ganzzahlen
Ga

Ganzzahlen in Rust

1 Übung

Über Ganzzahlen

Ganzzahlen sind ganze Zahlen ohne Bruch- oder Dezimalanteil. Im Rechner werden sie als Muster von Binärbits dargestellt.

Ganzzahlen können vorzeichenbehaftet sein oder nicht. Vorzeichenbehaftung bedeutet, dass eines der Bits der Zahl reserviert wird, um anzuzeigen, ob die Zahl negativ ist oder nicht.

Ganzzahlen haben alle eine Bitbreite. Das ist einfach die Anzahl der Bits, aus denen die Zahl besteht. Sie beeinflusst den maximalen Wert, den dieser Ganzzahltyp darstellen kann.

Ein sehr häufiger Ganzzahltyp ist zum Beispiel u8: eine vorzeichenlose 8-Bit-Ganzzahl. Vielleicht kennst du diesen Typ als einzelnes Byte. Er hat einen Minimalwert von 0 und einen Maximalwert von 255.

Rust hat 12 primitive Ganzzahltypen, aufgeteilt nach Bitbreite und Vorzeichenbehaftung:

Vorzeichenlos Vorzeichenbehaftet
u8 i8
u16 i16
u32 i32
u64 i64
u128 i128
usize isize

Die Bitbreite einer Ganzzahl wird immer durch die Zahl nach dem u oder i angegeben. usize und isize sind besonders: Sie haben die gleiche Breite wie ein Zeiger auf der Zielmaschine. Das bedeutet, dass usize und isize auf einer 64-Bit-Architektur 64 Bit breit sind, auf einer 32-Bit-Architektur jedoch 32 Bit breit.

Welchen soll ich verwenden?

Wenn du einfach nur eine Zahl darstellen musst, nimm im Allgemeinen einen i32: 32 Bit haben einen ausreichend großen Bereich, sodass ein Überlauf relativ unwahrscheinlich ist, und vorzeichenbehaftete Zahlen halten weniger Überraschungen bereit als vorzeichenlose. i32 entspricht einem long in C oder einem int in Java. Wenn du ein numerisches Literal verwendest und den Typ nicht explizit angibst, wird standardmäßig i32 verwendet.

Wenn du mit Binärdaten arbeitest, ist es am einfachsten, mit Bytes zu arbeiten: &[u8] oder Vec<u8>.

Rust verwendet usize für Größe und Indexierung von Collections. Der Grund dafür ist, dass ein Computer theoretisch nur usize::MAX Bytes Speicher adressieren kann, sodass keine größeren Collections im Arbeitsspeicher möglich sind. Deshalb kann usize nützlich sein, wenn du viel mit Collections arbeitest.

Wenn deine Daten nicht in eine 32-Bit-Ganzzahl passen, solltest du auf eine 64- oder 128-Bit-Ganzzahl erweitern. Wenn deine Daten nicht in eine 128-Bit-Ganzzahl passen, kannst du einen Big-Integer-Typ verwenden, wie er von num-bigint bereitgestellt wird.

16-Bit-Ganzzahlen sind nicht sehr verbreitet, können aber nützlich sein, wenn du für bestimmte Mikrocontroller entwickelst.

Wenn du weißt, dass es für deine Anwendung keine gültigen negativen Fälle gibt, ist es besser, eine vorzeichenlose Ganzzahl anstelle einer vorzeichenbehafteten zu verwenden. Das Zählen ist ein gutes Beispiel dafür.

Umwandlung zwischen Ganzzahlen

Rust hat keine impliziten numerischen Konvertierungen. Wenn du zwischen Ganzzahltypen umwandeln musst, gibt es zwei grundlegende Strategien: das Schlüsselwort as und die Traits From und TryFrom.

Die Verwendung des Schlüsselworts as ist einfach: expr as Type. Es gibt jedoch eine Reihe von Fallstricken und Feinheiten, die du bei der Verwendung von as-Casts beachten musst.

Trait-basierte Konvertierung ist etwas aufwendiger, aber sicherer: Konvertierungs-Traits werden nur dort implementiert, wo sie sicher sind. Zum Beispiel implementiert i32 From<u8>, From<u16>, From<i8> und From<i16>: Jeder Wert, der durch einen dieser Typen darstellbar ist, ist garantiert in einem i32 darstellbar. Er kann wie i32::from(expr) oder expr.into() verwendet werden, wobei expr zu einem dieser Typen aufgelöst wird. i32 implementiert außerdem TryFrom<u32>, TryFrom<u64>, TryFrom<u128>, TryFrom<usize>, TryFrom<i64>, TryFrom<i128> und TryFrom<isize>. Diese Konvertierungen werden je nach Wert entweder erfolgreich sein oder überlaufen. Um sie zu verwenden, musst du die Traits std::convert::TryFrom oder std::convert::TryInto importieren, je nach Bedarf, und dann i32::try_from(expr) oder expr.try_into() verwenden, wobei expr zu einem geeigneten Typ aufgelöst wird.

Die trait-basierte Konvertierung ist im Allgemeinen der as-Konvertierung vorzuziehen, insbesondere bei der Umwandlung von einem breiteren in einen schmaleren Typ. Trait-basierte Konvertierung ist unwesentlich teurer als as-Konvertierung: as aus Performance-Gründen zu verwenden, lohnt sich nur in einer extrem heißen Schleife.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab