Typen in C♯
Numeralia und Zeichenfolgenliterale werden zusammenfassend als Literale bezeichnet.
Jedes Literal hat einen bestimmten Typ, der festlegt, wie das Literal verwendet werden kann.
Typen von Literalen
Wir haben bisher schon verschiedene Literale, wie »65«, »12.82« oder »"Alpha"« kennengelernt. Diese gehören offensichtlich verschiedenen Typen an: Das erste Literal steht für eine Zahl ohne Nachkommastellen, der zweite für eine Zahl mit Nachkommastellen und der dritte ist gar keine Zahl, sondern ein Text. Tatsächlich ordnet man solchen Literalen in C♯ verschiedene sogenannte Typen zu (die man auch Datentypen nennt).
»int«
Ein Numerale ohne Punkt ».« aus dem Bereich von 0 bis 2147483647 hat den Typ »int«.
Der Datentyp »int« wird auch als ein ganzzahliger Typ bezeichnet, da seine Literale ganzzahlig sind, also keine Nachkommastellen haben.
Ein Numerale vom Datentyp »int« ist ein ganzzahliges Numerale.
Man kann Typnamen auch als prädikative Adjektive gebrauchen, obwohl dies nicht besonders schön klingt: „Dieses Literal ist int.“ bedeutet „Dieses Literal hat den Typ »int«.“ Man kann Typnamen auch als Präfixoid gebrauchen: „int -Literal“ bedeutet „Literal mit dem Typ »int«“.
»double«
Ein Numerale mit Punkt ».« hat den Typ »double«.
Dieser Typ ist im allgemeinen der Typ von Literalen mit Nachkommastellen, jedoch wird dieser Typ einem Literal auch dann zugewiesen, wenn das Literal gar keine richtigen Nachkommastellen hat, wie bei »2.0«, da es einfacher ist, das formale Kriterium heranzuziehen, welches am Anfang dieses Abschnitts genannt wurde.
Der Datentyp »double« wird auch als binärer Gleitkommatyp bezeichnet, da seine Zahlen intern normalerweise in einer sogenannten „binären Gleitkommadarstellung“ abgespeichert werden.
Ein Numerale vom Datentyp »double« ist ein binäres Gleitkommanumerale.
Bei Gleitkommazahlen sind kleine Abweichungen von den Literalwerten in den hinteren Stellen gestattet, wie etwa das folgende Beispiel zeigt.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( 1.9999999999999999 ); }}global::System.Console.Out
2
Dies zeigt erneut deutlich den Unterschied zwischen einem Numerale und seinem Wert.
Werte des Typs »double« können größer als Werte des Typs »int« sein, dafür sind sie aber in den hinteren Stelle ungenau.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( 9223372036854775808.0 ); }}global::System.Console.Out
9.22337203685478E+18
(Die Ausgabedarstellung »9.22337203685478E+18« bedeutet 9,22337203685478 × 10¹⁸.)
double-Werte sind in den hinteren Stellen manchmal ungenau. Daher sollten sie für prinzipiell ungenaue Werte verwendet werden, wie beispielsweise Meßwerte kontinuierlicher Größen (wie Länge, Geschwindigkeiten oder Temperaturen). Solche Werte können praktisch nie auf mehr als 14 Stellen gemessen werden, so daß es für ihre Speicherung und Verarbeitung akzeptabel ist, wenn ab der 14. Stelle Fehler auftreten.
Für Werte, deren Nachkommastellen alle ganz genau bestimmt sein sollen, wie beispielsweise Währungsbeträge, ist der Datentyp »double« nicht gedacht. Allerdings könnte man nicht zu große Währungsbeträge mit diesem Datentyp noch darstellen, indem man sie mit 100 multipliziert, um ohne Nachkommastellen auszukommen.
E-Numeralia
In einem Numerale steht »E« für „mal Zehn hoch“. »2E3« bedeutet also beispielsweise ‹ 2 × 10³ ›.
‹ 10³ › bezeichnet den Wert, den man erhält, wenn man die Zahl Eins 3-mal mit 10 multipliziert. Allgemein bezeichnet für eine natürliche Zahl n der Term ‹ 10ⁿ › den Wert, den man erhält, wenn man die Zahl Eins n -mal mit 10 multipliziert.
Dies bedeutet, daß das Dezimalkomma bei »2.0« um drei Schritte nach rechts verschoben werden soll. Man erhält so »2000.0«.
»2E3« bedeutet also nicht etwa „2³“, also die Zahl, welche man erhält indem man die Zahl Eins dreimal mit der Zahl 2 multipliziert (8).
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( 2E3 ); }}global::System.Console.Out
2000
Ein solches E-Numerale hat den Datentyp »double«, selbst wenn es keinen Punkt enthält.
Wir verzichten an dieser Stelle auf eine ausführliche Darstellung der Morphologie von E-Numeralia, da E-Numeralia im weiteren Verlauf dieses Kurses nur selten als Teile des Quelltextes vorkommen. Zahlenwerte werden von Programmen zwar manchmal in der E-Schreibweise ausgegeben, aber um diese zu verstehen, reicht die obenstehende Erklärung bereits aus.
»decimal«
Ein Numerale hat den Typ »decimal«, wenn es mit einem direkt nachfolgendem »m« gekennzeichnet ist.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( 0.1m ); }}global::System.Console.Out
0.1
Dieser Typ ist besonders für Zwecke geeignet, bei denen im Alltag vorkommende Zahlen genau gespeichert werden sollen, insbesondere auch für Währungsbeträge. Dies liegt zum einen daran, daß er viele Werte mit einer bestimmten kleinen Anzahl von Nachkommastellen im üblichen Dezimalsystem (wie beispielsweise 2) genau darstellen kann, die bei Verwendung des Typs »double« schon nicht mehr genau dargestellt werden können. Zum anderen kann dieser Typ insgesamt 28 Dezimalstellen korrekt darstellen, so daß auch noch relativ große Beträge korrekt dargestellt werden können (wenn sie nicht zu viele Nachkommastellen haben).
Andererseits benötigen Werte dieses Typs bei gleicher Information mehr Speicherplatz als Werte des Typs »double« und werden meistens langsamer verarbeitet.
Die Werte dieses Typs umfassen – anders als double-Werte – auch die Anzahl der Nachkommastellen, die Skalierung . Tatsächlich werden die Werte als ganze Zahl zusammen mit einer Skalierung gespeichert. Die folgenden Programme zeigen, daß die Anzahl der Nachkommanullen bei »decimal«, aber nicht bei »double«, auch in der Ausgabe sichtbar wird.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( 1.000m ); }}global::System.Console.Out
1.000
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( 1.000 ); }}global::System.Console.Out
1
Auch das Numerale »2E3m« hat den Typ »decimal«, ein E-Numerale hat den Typ »double« also nur dann, wenn nichts anderes festgelegt wird.
»string«
Ein Zeichenfolgenliteral hat den Typ »string«.
Program.cs
public static class Program
{ public static void Main()
{ global::System.Console.WriteLine
( "Alpha" ); }}global::System.Console.Out
Alpha
Ein “string ” ist ein “character string ”, also – wörtlich – eine Kette (Verkettung) von Schriftzeichen, eine Zeichenkette (Zeichenfolge).
Typen in C#
In C# unterscheidet man zwischen einfachen Typen und Klassentypen.
Wir kennen bisher drei einfache Typen und einen Referenztyp.
- einfache Typen
int
double
decimal- Klassentypen
string
Einfache Zahlentypen (wie »int«, »double« und »decimal«) werden auch „numerische Typen“ genannt.
Man kann sich die Unterscheidung zwischen einfachen Typen und Klassentypen vorläufig in etwa so erklären: Der für die Darstellung eines Wertes eines einfachen Typs benötigte Speicherplatz ist konstant (für jeden Wert eines Typs derselbe), während der Speicherplatz eines Wertes eines Klassentyps bei jedem Wert anders sein kann.
Typen im Quelltext
Bis auf weiteres schreiben wir Typen nicht in Programme. Sie dienen uns lediglich zur Beschreibung von Programmteilen.
Übungsfragen
? Literaltypen
Welchen Typ haben die folgenden Literale jeweils?
- 1
- 1.2
- 2E3
- 2E3m
- "2"
Zitate *
“If no real-type-suffix is specified, the type of the real literal is double. ”, C# Language Specification Version 5.0, 2.4.4.3 Real literals