Wir haben ja schon einige Variablentypen kennengelernt, hier eine komplette Auflistung aller Builtin-Typen (Eingebaute Variablentypen):
| Variablentyp | beinhaltet |
|---|---|
| int oder auch signed int | Ganzzahl (positiv und negativ) |
| unsigned int | Ganzzahl (nur positiv) |
| short oder auch signed short | Ganzzahl (positiv und negativ, kleiner Wertebereich) |
| unsigned short | Ganzzahl (nur positiv, kleiner Wertebereich) |
| long oder auch signed long | Ganzzahl (positiv und negativ, großer Wertebereich) |
| unsigned long | Ganzzahl (nur positiv, großer Wertebereich) |
| float | Gleitkommazahl |
| double | genauere Gleitkommazahl |
| long double | genauerste Gleitkommazahl |
| char | Buchstabe |
| signed char | Buchstabe (sowohl positiver als auch negativer ASCII Wert) |
| unsigned char | Ganzzahl (nur positiver ASCII Wert) |
| bool | enthält den Wert true oder false |
Dir fällt sicher signed und unsigned auf. Signed heißt mit 'sign' (Zeichen) - damit ist ein eventuelles Vorzeichen gemeint. Somit ist klar, dass unsigned keine negativen Zahlen beinhalten kann. Der Sinn ist der: eine Zahl wird intern (wie auch alles andere) Binär dargestellt. So hat ein int auf einem 32bit Betriebssystem wie Windows oder Linux genau 32 Bit. Das bedeutet, die Zahl 1 sieht Binär so aus:
00000000000000000000000000000001Wenn wir nun -1 nehmen, dann müssen wir ja irgendwo speichern, dass die Zahl negativ ist... das geht durch das 'signed' bit. Dieses Bit ist ganz links
10000000000000000000000000000001So würde es aussehen - das 'signed' Bit zeigt an, dass es sich um eine negative Zahl handelt. Es sieht aber tastächlich so aus:
11111111111111111111111111111111Denn es wird nicht bei -1 zum runterzählen angefangen, sondern bei dem kleinsten möglichen Wert zum hinaufzählen.
Weiters ist auffallend, dass es 3 char Typen gibt. Vorallem signed und unsigned?? Naja, auch das ist einfach erklärt: Der ASCII Zeichensatz umfasst 128 Zeichen - das ist relativ wenig. Da drin sind keine ß oder ä oder sonstige 'Sonderzeichen' enthalten. Jetzt muss ein char mindestens diese 128 Zeichen beinhalten können. Der C++ Standard schreibt aber nicht vor, wieviele Bit ein char groß sein muss, deshalb gibt es char als eigenständigen Typen. char ist groß genug um mindestens 128 Zeichen (von 0 bis 127). Ob char jetzt signed oder unsigned ist, ist nirgendwo definiert. Für uns ist das auch egal, denn char ist groß genug um darin Buchstaben zu haben - leider gibt es aber Probleme bei Sonderzeichen, wie zB. Umlauten, denn diese sind nicht im ASCII Zeichensatz definiert. Dies führt dazu, dass zu Darstellungsproblemen kommen kann (vorallem unter DOS, da DOS für Umlaute andere numerische Wert definiert hat, als Windows. Für alle geplagten Windowsler gibt es deshalb einen hilfreichen Sourcecode um dieses Problem zu umgehen).
bool kommt dir vielleicht aus der Mathematik bekannt vor: bool'sche Algebra. Ein bool (oder auch Boolean genannt) kann nur 2 Werte annehmen: true (wahr) oder false (unwahr) - die if-Bedingungen lassen Grüßen.
float und double sind beide für Kommazahlen geeignet, wobei double den wesentlich genaueren Wert annehmen kann, und long double ist das genauste was C++ zu bieten hat. Diese gleitkomma Zahlen werden auch wieder Binär dargstellt (dh bedeutet also, dass float weniger Bits hat als double und double weniger Bits hat als long double): das führt zu dem Problem, dass man Kommazahlen nicht genau angeben kann. Das Binärsystem unterstützt es einfach nicht. Deswegen werden Kommazahlen nur Näherungsweise angegeben. Wenn man also wirklich sehr genaue gleitkomma Zahlen braucht, sollte man auf eine Library zurückgreifen. Eine Library stellt bestimmte Variablentypen und/oder Funktionen, etc. zur Verfügung - mit denen sich dann eine bestimmte Aufgabe leichter lösen lässt, als wenn man den Sourcecode selber schreiben muss.
short, int und long - wieso 3 Typen für Ganzzahlen? Auf modernen 32 Bit Betriebssystemen wie Linux und Windows sind int und long gleich lang (32 Bit). short ist da etwas kleiner mit lediglich 16 Bit. Wenn man nun aber eine wirklich große Zahl braucht, nimmt man am besten unsigned long, auch wenn ein unsigned int gleich groß wäre, denn schließlich kann es ja sein, dass wir unser Programm auch auf nicht 32 Bit Betriebssysteme portieren wollen. Wenn man eine normale ganze Zahl braucht, nimmt man am besten int (auch wenn ein short uU auch reichen würde, int ist einfach besser - es sei denn es geht wirklich um die größe und da ist short uU signifikant kleiner).
Viele gängige Compiler bieten einen größeren ganz Zahl Typen an: long long oder __int64. Diese Typen sind größer als long und, wie der Name __int64 schon sagt: 64 Bit groß. Allerdings ist weder long long noch __int64 im C++ Standard enthalten, weswegen man diese Typen mit Vorsicht genießen sollte. Vermutlich wird der nächste C++ Standard den Typen long long einführen (der neueste C Standard kennt long long bereits) - man sollte also auf dieses Pferd setzen.