Menu

C++-Datentypen: int, double, char, bool und mehr

Ein praktischer Rundgang durch die grundlegenden Datentypen von C++ - Ganzzahlen, Gleitkomma, char und bool - sowie Größen, signed vs. unsigned, Literale und Suffixe, Überlauf und wie man den richtigen Typ wählt.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Warum Typen in C++ wichtig sind

Auf der Seite zu Variablen hast du Werte mit einem expliziten Typ wie int age = 30; deklariert. Dieser Typ ist nicht bloß ein Etikett - er sagt dem Compiler, wie viele Bytes er reservieren soll, wie diese Bytes zu interpretieren sind und welche Operationen erlaubt sind. Wähle den falschen Typ, und du kannst stillschweigend Präzision verlieren, überlaufen oder undefiniertes Verhalten auslösen.

C++ fasst seine eingebauten Typen in wenige Familien zusammen: Ganzzahlen, Gleitkommazahlen, einen Zeichentyp und einen booleschen Typ. Schauen wir uns jeden an und dann die Regeln, über die man stolpert.

Die grundlegenden Typen

Hier ist je ein Beispiel jedes Kerntyps in einem einzigen Programm. Achte auf die Literal-Suffixe (L, f, u) und die einfachen Anführungszeichen bei char:

Ein bool wird standardmäßig als 1 oder 0 ausgegeben, nicht als true/false. Ein char verwendet einfache Anführungszeichen - 'A' ist ein Zeichen, während "A" (doppelte Anführungszeichen) ein String-Literal ist, ein völlig anderer Typ. Diese beiden Fehler sind am Anfang extrem häufig.

Größen sind nicht festgelegt

Das ist die größte Überraschung, wenn man von Sprachen wie Java kommt. Der C++-Standard garantiert nur die Mindestgrößen und eine relative Reihenfolge (shortintlonglong long). Die tatsächliche Größe hängt von deinem Compiler und deiner Plattform ab. Prüfe es immer mit sizeof:

In einem typischen 64-Bit-Linux-Build siehst du int = 4, long = 8. Unter 64-Bit-Windows ist long jedoch nur 4 Bytes groß. Genau diese Portabilitätslücke ist der Grund, warum du keinen Code schreiben solltest, der annimmt, dass long 64 Bit ist.

Wenn du eine exakte Breite brauchst, greife zu den Ganzzahltypen fester Breite aus <cstdint>:

Verwende int32_t/int64_t für Dateiformate, Netzwerkprotokolle oder alles, was sich auf allen Maschinen identisch verhalten muss. Beachte die Umwandlung (int)a - das Streamen eines 8-Bit-Typs gibt ihn als Zeichen aus, nicht als Zahl, also wandle ihn zuerst um.

Signed vs. unsigned

Jeder Ganzzahltyp gibt es in zwei Varianten. Ein signed-Typ kann negative Werte aufnehmen; ein unsigned-Typ nicht und tauscht den negativen Bereich gegen ein höheres positives Maximum. Das einfache int ist standardmäßig signed.

Von einer vorzeichenlosen 0 zu subtrahieren springt zu einer riesigen positiven Zahl, statt negativ zu werden. Das erwischt die Leute ständig - besonders mit size_t (ein unsigned-Typ), den .size() zurückgibt:

vector<int> v = {1, 2, 3};
// GEFAHR: v.size() ist unsigned. Wenn v leer ist, springt v.size() - 1
// auf eine gigantische Zahl und die Schleife läuft fast endlos.
for (size_t i = 0; i <= v.size() - 1; i++) { /* ... */ }

Bevorzuge i < v.size() (niemals <= size() - 1) oder umgehe das ganze Problem mit einer bereichsbasierten for-Schleife.

Ganzzahlüberlauf ist undefiniertes Verhalten

Anders als der Überlauf von unsigned (der wohldefiniert ist) ist der Überlauf von vorzeichenbehafteten Ganzzahlen in C++ undefiniertes Verhalten. Der Compiler darf alles tun - Müll zurückgeben, die Prüfung wegoptimieren oder abstürzen:

Die Lösung ist dieselbe wie die Überlauffalle in jeder Sprache: führe die Arithmetik in einem breiteren Typ aus. Wandle einen Operanden vor dem + in long long um, damit die Addition in 64 Bit erfolgt. Das Ergebnis hinterher umzuwandeln ist zu spät - der Überlauf ist bereits passiert.

Den richtigen Typ wählen

Für den meisten Code sind die Standardwerte in Ordnung: int für ganze Zahlen, double für Dezimalzahlen. Greife nur dann zu etwas anderem, wenn du einen Grund hast.

TypTypische GrößeVerwenden, wenn
int32 BitDer Standard für ganze Zahlen
long long64 BitWerte über ~2 Milliarden: Zeitstempel, große Zähler
double64 BitDer Standard für Dezimalzahlen - gute Präzision
float32 BitSpeicherknappe Arrays, bei denen Präzision leiden darf
bool1 ByteEin true/false-Flag
int32_t / int64_texaktPlattformübergreifende Formate, Protokolle, Bitmanipulation

Ein paar Fallstricke, die du im Kopf behalten solltest. float hat nur etwa 7 signifikante Dezimalstellen, daher ist 0.1f + 0.2f nicht exakt 0.3 - bevorzuge double, es sei denn, du musst wirklich Speicher sparen. Und char kann je nach Plattform signed oder unsigned sein, also gib signed char oder unsigned char an, wenn du mit rohen Bytes rechnest.

Als Nächstes: Das Schlüsselwort auto

Den Typ jedes Mal auszuschreiben wird mühsam, und manchmal ist der Typ lang oder schwer zu benennen. C++ lässt den Compiler ihn mit dem Schlüsselwort auto für dich ableiten - auto x = 42; macht x zu einem int, und auto it = v.begin(); erspart dir das Tippen eines umständlichen Iterator-Typs. Die nächste Seite behandelt, wann auto den Code klarer macht und wann es zu viel verbirgt.

Häufig gestellte Fragen

Was sind die grundlegenden Datentypen in C++?

Die fundamentalen Typen sind Ganzzahlen (short, int, long, long long), Gleitkommazahlen (float, double, long double), der Zeichentyp char und der boolesche Typ bool. Jeder Ganzzahltyp kann zudem signed oder unsigned sein. Alles andere - std::string, Arrays, deine eigenen Klassen - baut darauf auf.

Was ist der Unterschied zwischen int und long in C++?

Beide speichern ganze Zahlen, aber long ist garantiert mindestens so breit wie int (oft 64 Bit auf 64-Bit-Plattformen, aber nur 32 Bit unter Windows). Der Standard legt nur die Mindestgrößen fest, daher verwende für eine garantierte Breite die Typen fester Breite aus <cstdint> wie int32_t und int64_t.

Wie groß ist ein int in C++?

Der Standard garantiert nur, dass int mindestens 16 Bit hat, aber auf praktisch jedem modernen Desktop und Server sind es 32 Bit. Da die Größen plattformabhängig sind, gehe nie von etwas aus - gib sizeof(int) aus, um es zu prüfen, oder verwende <cstdint>-Typen wie int32_t, wenn du eine exakte Breite brauchst.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S