C# bietet, wie viele statisch typisierte Sprachen, eine Reihe von Typen, die Ganzzahlen repräsentieren, jeder mit seinem eigenen Wertebereich. Am unteren Ende hat der Typ sbyte einen Minimalwert von -128 und einen Maximalwert von 127. Wie bei allen Ganzzahltypen sind diese Werte als <type>.MinValue und <type>.MaxValue verfügbar. Am oberen Ende hat der Typ long einen Minimalwert von -9.223.372.036.854.775.808 und einen Maximalwert von 9.223.372.036.854.775.807. Dazwischen liegen die Typen short und int.
Jeder der oben genannten Typen hat ein vorzeichenloses Gegenstück: sbyte/byte, short/ushort, int/uint und long/ulong. In allen Fällen reicht der Wertebereich von 0 bis zum negativen vorzeichenbehafteten Maximum mal 2 plus 1.
Werte vorzeichenloser Ganzzahltypen werden mit einer einfachen Basis-2-Darstellung repräsentiert. Werte vorzeichenbehafteter Typen verwenden die Darstellung vorzeichenbehafteter Zahlen im Zweierkomplement.
Die Vielzahl der Ganzzahltypen spiegelt die Maschinenarchitekturen wider: die Größe der Register, die Größe der Argumente von CPU-Anweisungen und den Umgang mit dem Vorzeichen innerhalb der CPU. Ein Wert vom Typ long verwendet 64 Bit, während ein Wert vom Typ sbyte 8 Bit verwendet. In manchen Fällen hat das Auswirkungen auf die CPU-Leistung, den Speicherverbrauch und sogar die Festplattennutzung (wobei die Wahl eines kleineren Ganzzahltyps in der Regel von Vorteil ist). Auch die Wahl des type für eine Ganzzahl kann ein behelfsmäßiges Mittel sein, um anderen Entwicklern etwas über den erwarteten Wertebereich mitzuteilen. Der Typ int wird weithin als Standardtyp verwendet, wenn nichts Besonderes an der jeweiligen Verwendung festgestellt wurde. Der Typ long oder ulong wird häufig als einfache Kennung verwendet. Die Größe des Typs in Bytes bestimmt den Wertebereich.
Die bisher besprochenen Typen sind primitive Typen. Jeder ist mit einem struct-Alias gepaart, der Felder (wie MinValue) und Methoden (wie ToString()) implementiert, die dem Typ zugeordnet sind.
| Typ | Struct | Breite | Minimum | Maximum |
|---|---|---|---|---|
sbyte |
SByte |
8 bit | -128 | +127 |
short |
Int16 |
16 bit | -32_768 | +32_767 |
int |
Int32 |
32 bit | -2_147_483_648 | +2_147_483_647 |
long |
Int64 |
64 bit | -9_223_372_036_854_775_808 | +9_223_372_036_854_775_807 |
byte |
Byte |
8 bit | 0 | +255 |
ushort |
UInt16 |
16 bit | 0 | +65_535 |
uint |
UInt32 |
32 bit | 0 | +4_294_967_295 |
ulong |
UInt64 |
64 bit | 0 | +18_446_744_073_709_551_615 |
Eine Variable (oder ein Ausdruck) eines Typs kann leicht in einen anderen umgewandelt werden. Bei einer Zuweisung zum Beispiel: Wenn der Typ des zugewiesenen Werts (rechte Seite, rhs) sicherstellt, dass der Wert in den Wertebereich des Typs passt, dem zugewiesen wird (linke Seite, lhs), dann ist eine einfache Zuweisung möglich:
ulong ul;
uint ui = uint.MaxValue;
ul = ui; // no problem
Andererseits: Wenn der Wertebereich des Typs, von dem zugewiesen wird, keine Teilmenge des Wertebereichs des Zieltyps ist, dann ist eine Cast-Operation mit () erforderlich, selbst wenn der konkrete Wert im Wertebereich des Ziels liegt:
uint ui;
short s = 42;
ui = (uint)s;
Wenn der Wert im obigen Beispiel stattdessen außerhalb des Wertebereichs des Ziels läge, würde ein Überlauf auftreten. Siehe overflow.
Ob ein Cast erforderlich ist, hängt von den beiden beteiligten Typen ab und nicht von einem konkreten Wert.
Die folgenden Absätze behandeln das Casting von Ganzzahltypen. Eine breitere Diskussion von Casting und Typkonvertierung findest du unter casting. In dieser Dokumentation wird die Konvertierung zwischen Ganzzahltypen und Gleitkommazahlen, char und bool behandelt.
C#s Typsystem ist etwas strenger als das von C oder JavaScript, und infolgedessen sind Casting-Operationen eingeschränkter. Implizites Casting findet zwischen zwei numerischen Typen statt, solange der Zieltyp Skalierung und Vorzeichen des Werts des Ausgangstyps bewahren kann.
Ein impliziter Cast wird nicht durch eine besondere Syntax gekennzeichnet.
Wo numerische Typen nicht implizit gecastet werden können, kannst du in der Regel den expliziten Cast-Operator verwenden.
Wenn der Wert, der gecastet wird, vom Zieltyp nicht dargestellt werden kann, weil er nicht breit genug ist oder ein Vorzeichenkonflikt besteht, kann eine Überlauf-Ausnahme ausgelöst werden.
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;
// implicit cast
int from_ushort = shortUnsignedInt; // 65535
float from_int = largeInt; // -21474836E+09
// explicit cast
uint from_largeInt = (uint)largeInt; // 2147483647
uint from_neg = (uint) largeNegInt; // 2147483648 or OverflowException is thrown (if checked)
Die Klasse BitConverter bietet eine bequeme Möglichkeit, Ganzzahltypen in Byte-Arrays und zurück umzuwandeln.