C# 7.0 - kurz & gut

C# 7.0 - kurz & gut

von: Joseph Albahari, Ben Albahari

O'Reilly Verlag, 2018

ISBN: 9783960101758

Sprache: Deutsch

238 Seiten, Download: 867 KB

 
Format:  EPUB, auch als Online-Lesen

geeignet für: geeignet für alle DRM-fähigen eReader geeignet für alle DRM-fähigen eReader Apple iPad, Android Tablet PC's Apple iPod touch, iPhone und Android Smartphones Online-Lesen


 

eBook anfordern

Mehr zum Inhalt

C# 7.0 - kurz & gut



Numerische Typen


C# bietet die folgenden vordefinierten numerischen Typen:

C#-Typ

Systemtyp

Suffix

Breite

Bereich

Ganzzahlig mit Vorzeichen

sbyte

SByte

 

8 Bit

–27 bis 27 – 1

short

Int16

 

16 Bit

–215 bis 215 – 1

int

Int32

 

32 Bit

–231 bis 231 – 1

long

Int64

L

64 Bit

–263 bis 263 – 1

Ganzzahlig ohne Vorzeichen

byte

Byte

 

8 Bit

0 bis 28 – 1

ushort

UInt16

 

16 Bit

0 bis 216 – 1

uint

UInt32

U

32 Bit

0 bis 232 – 1

ulong

UInt64

UL

64 Bit

0 bis 264 – 1

Reell

float

Single

F

32 Bit

± (~10–45 bis 1038)

double

Double

D

64 Bit

± (~10–324 bis 10308)

decimal

Decimal

M

128 Bit

± (~10–28 bis 1028)

Von den ganzzahligen Typen sind int und long Bürger erster Klasse und werden von C# und der Runtime bevorzugt. Die anderen ganzzahligen Typen werden üblicherweise im Dienste der Interoperabilität eingesetzt oder wenn eine effiziente Speicherplatznutzung wichtig ist.

Von den reellen Zahltypen werden float und double auch als Gleitkommatypen bezeichnet und üblicherweise für wissenschaftliche Berechnungen sowie im Grafikumfeld genutzt. Der Typ decimal wird in der Regel für finanzmathematische Berechnungen verwendet, bei denen eine exakte Basis-10-Arithmetik und hohe Genauigkeit erforderlich sind. (Technisch betrachtet, ist decimal ebenfalls ein Gleitkommatyp, wird normalerweise aber nicht als solcher bezeichnet.)

Numerische Literale

Ganzzahlliterale können mit der Dezimal- oder der Hexadezimalnotation dargestellt werden; die Hexadezimalnotation wird mit dem Präfix 0x angezeigt (z. B. entspricht 0x7f dem Dezimalwert 127). Seit C# 7.0 können Sie auch das Präfix 0b für Binärliterale einsetzen. Reelle Literale können die Dezimal- oder die Exponentialnotation nutzen, z. B. 1E06.

Ab C# 7.0 können numerische Literale für eine bessere Lesbarkeit durch Unterstriche ergänzt werden (zum Beispiel 1_000_000).

Typableitung bei numerischen Literalen

Standardmäßig geht der Compiler davon aus, dass ein numerisches Literal entweder einen double-Wert oder einen ganzzahligen Wert darstellt:

  • Wenn das Literal einen Dezimaltrenner oder das Exponential-symbol (E) enthält, ist der Typ double.
  • Andernfalls ist der Typ des Literals der erste Typ aus der folgenden Liste, in den der Wert des Literals passt: int, uint, long und ulong.

Hier sehen Sie Beispiele dafür:

Console.Write ( 1.0.GetType()); // Double (double)

Console.Write ( 1E06.GetType()); // Double (double)

Console.Write ( 1.GetType()); // Int32 (int)

Console.Write ( 0xF0000000.GetType()); // UInt32 (uint)

Console.Write (0x100000000.GetType()); // Int64 (long)

Numerische Suffixe

Die numerischen Suffixe, die in der vorangegangenen Tabelle aufgeführt sind, definieren den Typ eines Literals:

decimal d = 3.5M; // M = decimal (ignoriert Groß-/Kleinschrei-

// bung)

Die Suffixe U und L werden nur selten benötigt, weil die Typen uint, long und ulong fast immer erschlossen werden können oder int implizit in sie umgewandelt werden kann.

long i = 5; // implizite Umwandlung von int in long

Das Suffix D ist technisch gesehen redundant, da bei allen Literalen, die einen Dezimaltrenner enthalten, geschlossen wird, dass es double-Werte sind (und man einem numerischen Literal immer einen Dezimaltrenner anhängen kann). Die Suffixe F und M sind am nützlichsten und außerdem unumgänglich, wenn man float- oder decimal-Literale angeben will. Ohne Suffixe ließen sich die folgenden Anweisungen nicht kompilieren, da geschlossen würde, dass 4.5 den Typ double hat, der sich nicht implizit in float oder decimal umwandeln lässt.

float f = 4.5F; // kompiliert ohne Suffix nicht

decimal d = 4.5M; // kompiliert ohne Suffix nicht

Numerische Umwandlung

Ganzzahlige Umwandlungen

Ganzzahlige Umwandlungen sind implizit, wenn der Zieltyp jeden möglichen Wert des Ausgangstyps darstellen kann. Andernfalls ist eine explizite Umwandlung erforderlich, zum Beispiel so:

int x = 12345; // int ist ein 32-Bit-Wert

long y = x; // implizite Umwandlung in einen 64-Bit-int

short z = (short)x; // explizite Umwandlung in einen 16-Bit-int

Reelle Umwandlungen

Ein float kann implizit in einen double umgewandelt werden, weil ein double jeden möglichen float-Wert darstellen kann. Die umgekehrte Umwandlung muss explizit sein.

Die Umwandlung zwischen decimal und den anderen reellen Typen muss explizit sein.

Reelle Typen in ganzzahlige Typen umwandeln

Die Umwandlung eines ganzzahligen Typs in einen reellen Typ ist immer implizit, während die umgekehrte Umwandlung immer explizit angegeben werden muss. Bei der Umwandlung eines Gleitkommatyps in einen ganzzahligen Typ wird immer der möglicherweise vorhandene Nachkommateil der Zahl abgeschnitten. Rundende Umwandlungen können Sie mit der statischen Klasse System.Convert durchführen.

Ein Nachteil der impliziten Umwandlung ist, dass bei der Umwandlung großer ganzzahlige Werte in Gleitkommawerte zwar die Größenordnung erhalten bleibt, gelegentlich aber Genauigkeit verloren geht.

int i1 = 100000001;

float f = i1; // Größe bleibt erhalten, Genauigkeit ver-

// schwindet

int i2 = (int)f; //...

Kategorien

Service

Info/Kontakt