Fundamentale Typen
(Siehe auch Typensystemübersicht und die Liste der vom C++-Bibliothek bereitgestellten typbezogenen Dienstprogramme)
Die folgenden Typen werden kollektiv als grundlegende Typen bezeichnet
- (möglicherweise cv-qualifiziert) void
|
(seit C++11) |
Inhalt |
[bearbeiten] void
- void — Typ mit einer leeren Menge von Werten. Es ist ein unvollständiger Typ, der nicht vervollständigt werden kann (folglich sind Objekte vom Typ void nicht zulässig). Es gibt keine Arrays von void, noch Referenzen auf void. Jedoch sind Zeiger auf void und Funktionen, die vom Typ void zurückgeben (in anderen Sprachen Prozeduren), zulässig.
|
std::nullptr_t
std::nullptr_t ist der Typ des Nullzeiger-Literals, sizeof(std::nullptr_t) ist gleich sizeof(void*). |
(seit C++11) |
[bearbeiten] Ganzzahlige Typen
[bearbeiten] Standard-Ganzzahltypen
- int — grundlegender Ganzzahltyp. Das Schlüsselwort int kann weggelassen werden, wenn einer der unten aufgeführten Modifikatoren verwendet wird. Wenn keine Längenmodifikatoren vorhanden sind, ist eine Breite von mindestens 16 Bit garantiert. Auf 32/64-Bit-Systemen ist jedoch fast ausschließlich eine Breite von mindestens 32 Bit garantiert (siehe unten).
[bearbeiten] Modifikatoren
Modifiziert den grundlegenden Ganzzahltyp. Kann in beliebiger Reihenfolge gemischt werden. Nur einer aus jeder Gruppe kann im Typnamen vorhanden sein.
- Vorzeichenbehaftung
- signed — der Zieltyp wird vorzeichenbehaftet dargestellt (dies ist der Standard, wenn weggelassen)
- unsigned — der Zieltyp wird vorzeichenlos dargestellt
- Größe
- short — der Zieltyp wird für den Speicherplatz optimiert und hat eine Breite von mindestens 16 Bit.
- long — der Zieltyp hat eine Breite von mindestens 32 Bit.
|
|
(seit C++11) |
Hinweis: Wie bei allen Typspezifizierern ist jede Reihenfolge zulässig: unsigned long long int und long int unsigned long bezeichnen denselben Typ.
[bearbeiten] Eigenschaften
Die folgende Tabelle fasst alle verfügbaren Standard-Ganzzahltypen und ihre Eigenschaften in verschiedenen gängigen Datenmodellen zusammen
| Typspezifizierer | Entsprechender Typ | Breite in Bits nach Datenmodell | ||||
|---|---|---|---|---|---|---|
| C++-Standard | LP32 | ILP32 | LLP64 | LP64 | ||
signed char
|
signed char | mindestens 8 |
8 | 8 | 8 | 8 |
unsigned char
|
unsigned char | |||||
short
|
short int | mindestens 16 |
16 | 16 | 16 | 16 |
short int
| ||||||
signed short
| ||||||
signed short int
| ||||||
unsigned short
|
unsigned short int | |||||
unsigned short int
| ||||||
int
|
int | mindestens 16 |
16 | 32 | 32 | 32 |
signed
| ||||||
signed int
| ||||||
unsigned
|
unsigned int | |||||
unsigned int
| ||||||
long
|
long int | mindestens 32 |
32 | 32 | 32 | 64 |
long int
| ||||||
signed long
| ||||||
signed long int
| ||||||
unsigned long
|
unsigned long int | |||||
unsigned long int
| ||||||
long long
|
long long int (C++11) |
mindestens 64 |
64 | 64 | 64 | 64 |
long long int
| ||||||
signed long long
| ||||||
signed long long int
| ||||||
unsigned long long
|
unsigned long long int (C++11) | |||||
unsigned long long int
| ||||||
Hinweis: Die Ganzzahl-Arithmetik ist für vorzeichenbehaftete und vorzeichenlose Ganzzahltypen unterschiedlich definiert. Siehe arithmetische Operatoren, insbesondere Integer-Überläufe.
std::size_t ist der vorzeichenlose Ganzzahltyp des Ergebnisses des sizeof-Operators sowie des sizeof...-Operators und des alignof-Operators(seit C++11).
Erweiterte GanzzahltypenDie erweiterten Ganzzahltypen sind implementierungsabhängig. Beachten Sie, dass Ganzzahltypen mit fester Breite typischerweise Aliase der Standard-Ganzzahltypen sind. |
(seit C++11) |
[bearbeiten] Boolescher Typ
- bool — Ganzzahltyp, der einen der beiden Werte speichern kann:
trueoderfalse. Der Wert von sizeof(bool) ist implementierungsabhängig und kann von 1 abweichen.
[bearbeiten] Zeichentypen
Zeichentypen sind Ganzzahltypen, die zur Darstellung von Zeichen verwendet werden.
- signed char — Typ für vorzeichenbehaftete Zeichenrepräsentation.
- unsigned char — Typ für vorzeichenlose Zeichenrepräsentation. Wird auch zur Inspektion von Objektrepräsentationen (roher Speicher) verwendet.
- char — Typ für Zeichenrepräsentation, die auf dem Zielsystem am effizientesten verarbeitet werden kann (hat die gleiche Darstellung und Ausrichtung wie entweder signed char oder unsigned char, ist aber immer ein eigenständiger Typ). Mehrbyte-Zeichenketten verwenden diesen Typ zur Darstellung von Code-Einheiten. Für jeden Wert vom Typ unsigned char im Bereich
[0,255], ergibt die Konvertierung des Wertes in char und dann zurück in unsigned char den ursprünglichen Wert.(seit C++11) Die Vorzeichenbehaftung von char hängt vom Compiler und der Zielplattform ab: Die Standardeinstellungen für ARM und PowerPC sind typischerweise vorzeichenlos, die Standardeinstellungen für x86 und x64 sind typischerweise vorzeichenbehaftet. - wchar_t — Typ für die Darstellung von Wide-Zeichen (siehe Wide-Strings). Er hat die gleiche Größe, Vorzeichenbehaftung und Ausrichtung wie einer der Ganzzahltypen, ist aber ein eigenständiger Typ. In der Praxis sind es 32 Bit und sie speichern UTF-32 unter Linux und vielen anderen Nicht-Windows-Systemen, aber 16 Bit und speichern UTF-16-Code-Einheiten unter Windows. Der Standard verlangte früher, dass wchar_t groß genug ist, um jeden unterstützten Zeichencode-Punkt darzustellen. Diese Anforderung kann jedoch unter Windows nicht erfüllt werden und wird daher als Fehler betrachtet und entfernt.
|
|
(seit C++11) |
|
|
(seit C++20) |
Zusätzlich zu den minimalen Bit-Anzahlen garantiert der C++-Standard, dass
- 1 == sizeof(char)
≤sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long).
Hinweis: Dies erlaubt den Extremfall, bei dem Bytes 64 Bit groß sind, alle Typen (einschließlich char) 64 Bit breit sind und sizeof für jeden Typ 1 zurückgibt.
[bearbeiten] Gleitkommatypen
[bearbeiten] Standard-Gleitkommatypen
Die folgenden drei Typen und ihre cv-qualifizierten Versionen werden zusammen als Standard-Gleitkommatypen bezeichnet.
- float — Gleitkommatyp einfacher Genauigkeit. Normalerweise IEEE-754 binär32-Format.
- double — Gleitkommatyp doppelter Genauigkeit. Normalerweise IEEE-754 binär64-Format.
- long double — Gleitkommatyp erweiterter Genauigkeit. Entspricht nicht unbedingt den von IEEE-754 vorgeschriebenen Typen.
- IEEE-754 binär128-Format wird von einigen HP-UX-, SPARC-, MIPS-, ARM64- und z/OS-Implementierungen verwendet.
- Das bekannteste IEEE-754 binär64-Erweiterungsformat ist das x87 80-Bit-Erweiterungspräzisionsformat. Es wird von vielen x86- und x86-64-Implementierungen verwendet (eine bemerkenswerte Ausnahme ist MSVC, das long double im selben Format wie double, d. h. binär64, implementiert).
- Auf PowerPC kann Double-Double-Arithmetik verwendet werden.
Erweiterte GleitkommatypenDie erweiterten Gleitkommatypen sind implementierungsabhängig. Sie können Gleitkommatypen mit fester Breite enthalten. |
(seit C++23) |
[bearbeiten] Eigenschaften
Gleitkommatypen können Spezialwerte unterstützen
- Unendlichkeit (positiv und negativ), siehe INFINITY
- die negative Null, -0.0. Sie ist gleich der positiven Null, aber in einigen arithmetischen Operationen sinnvoll, z. B. 1.0 / 0.0 == INFINITY, aber 1.0 / -0.0 == -INFINITY), und für einige mathematische Funktionen, z. B. sqrt(std::complex)
- nicht-eine-Zahl (NaN), die mit nichts (einschließlich sich selbst) gleich ist. Mehrere Bit-Muster stellen NaNs dar, siehe std::nan, NAN. Beachten Sie, dass C++ keine besondere Beachtung für Signalisierungs-NaNs außer deren Erkennung durch std::numeric_limits::has_signaling_NaN schenkt und alle NaNs als still behandelt.
Gleitkommazahlen können mit arithmetischen Operatoren +, -, / und * sowie verschiedenen mathematischen Funktionen aus <cmath> verwendet werden. Sowohl eingebaute Operatoren als auch Bibliotheksfunktionen können Gleitkommains-Ausnahmen auslösen und errno setzen, wie in math errhandling beschrieben.
Gleitkommaausdrücke können einen größeren Bereich und eine höhere Präzision haben, als ihre Typen angeben, siehe FLT_EVAL_METHOD. Gleitkommaausdrücke können auch kontrahiert werden, d. h. berechnet werden, als ob alle Zwischenwerte unendlichen Bereich und unendliche Präzision hätten, siehe #pragma STDC FP_CONTRACT. Standard-C++ beschränkt die Genauigkeit von Gleitkommaoperationen nicht.
Einige Operationen auf Gleitkommazahlen werden vom Gleitkommaumgebung beeinflusst und ändern deren Zustand (insbesondere die Rundungsrichtung).
Implizite Konvertierungen sind zwischen Gleitkommatypen und Ganzzahltypen definiert.
Siehe Grenzen von Gleitkommatypen und std::numeric_limits für zusätzliche Details, Grenzen und Eigenschaften der Gleitkommatypen.
[bearbeiten] Wertebereich
Die folgende Tabelle bietet eine Referenz für die Grenzen gängiger numerischer Darstellungen.
Vor C++20 erlaubte der C++-Standard jede vorzeichenbehaftete Ganzzahl-Darstellung, und der minimal garantierte Bereich von N-Bit-Ganzzahlen lag zwischen -(2N-1
-1) und +2N-1
-1 (z. B. −127 bis 127 für einen vorzeichenbehafteten 8-Bit-Typ), was den Grenzen von Einerkomplement oder Vorzeichen und Betrag entspricht.
Alle C++-Compiler verwenden jedoch die Zweierkomplement-Darstellung, und ab C++20 ist sie die einzige vom Standard zugelassene Darstellung mit dem garantierten Bereich von -2N-1
bis +2N-1
-1 (z. B. −128 bis 127 für einen vorzeichenbehafteten 8-Bit-Typ).
8-Bit-Einerkomplement- und Vorzeichen-Betrag-Darstellungen für char sind seit C++11 nicht mehr zulässig (durch die Auflösung von CWG-Issue 1759), da eine UTF-8-Code-Einheit mit dem Wert 0x80, die in einem UTF-8-Stringliteral verwendet wird, in einem char-Objekt gespeichert werden muss.
Der Bereich für einen Gleitkommatyp T ist wie folgt definiert
- Der minimal garantierte Bereich ist die negativste endliche Gleitkommazahl, die in
Tdarstellbar ist, bis zur positivsten endlichen Gleitkommazahl, die inTdarstellbar ist. - Wenn negative Unendlichkeit in
Tdarstellbar ist, wird der Bereich vonTauf alle negativen reellen Zahlen erweitert. - Wenn positive Unendlichkeit in
Tdarstellbar ist, wird der Bereich vonTauf alle positiven reellen Zahlen erweitert.
Da negative und positive Unendlichkeit in ISO/IEC/IEEE 60559-Formaten darstellbar sind, liegen alle reellen Zahlen innerhalb des Bereichs der darstellbaren Werte eines Gleitkommatyps, der ISO/IEC/IEEE 60559 entspricht.
| Typ | Größe in Bits | Format | Wertebereich | |
|---|---|---|---|---|
| Ungefähr | Exakt | |||
| Zeichen | 8 | signed | −128 bis 127 | |
| unsigned | 0 bis 255 | |||
| 16 | UTF-16 | 0 bis 65535 | ||
| 32 | UTF-32 | 0 bis 1114111 (0x10ffff) | ||
| Ganzzahl | 16 | signed | ± 3.27 · 104 | −32768 bis 32767 |
| unsigned | 0 bis 6.55 · 104 | 0 bis 65535 | ||
| 32 | signed | ± 2.14 · 109 | −2,147,483,648 bis 2,147,483,647 | |
| unsigned | 0 bis 4.29 · 109 | 0 bis 4,294,967,295 | ||
| 64 | signed | ± 9.22 · 1018 | −9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807 | |
| unsigned | 0 bis 1.84 · 1019 | 0 bis 18,446,744,073,709,551,615 | ||
| binary Gleit- komma |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
| |
| 80[Anm. 1] | x86 |
|
| |
| 128 | IEEE-754 |
|
| |
- ↑ Die Objekt-Repräsentation belegt normalerweise 96/128 Bit auf 32/64-Bit-Plattformen.
Hinweis: Tatsächliche (im Gegensatz zu garantierten minimalen) Grenzen für die Werte, die von diesen Typen dargestellt werden können, sind in C-Schnittstelle für numerische Grenzen und std::numeric_limits verfügbar.
[bearbeiten] Datenmodelle
Die von jeder Implementierung getroffenen Entscheidungen über die Größen der grundlegenden Typen werden kollektiv als Datenmodell bezeichnet. Vier Datenmodelle fanden breite Akzeptanz
32-Bit-Systeme
- LP32 oder 2/4/4 (int ist 16-Bit, long und Zeiger sind 32-Bit)
- Win16-API
- ILP32 oder 4/4/4 (int, long und Zeiger sind 32-Bit);
- Win32-API
- Unix und Unix-ähnliche Systeme (Linux, macOS)
64-Bit-Systeme
- LLP64 oder 4/4/8 (int und long sind 32-Bit, Zeiger ist 64-Bit)
- Win32 API (auch Windows API genannt) mit Kompilierungsziel 64-Bit-ARM (AArch64) oder x86-64 (auch x64 genannt)
- LP64 oder 4/8/8 (int ist 32-Bit, long und Zeiger sind 64-Bit)
- Unix und Unix-ähnliche Systeme (Linux, macOS)
Andere Modelle sind sehr selten. Zum Beispiel erschien ILP64 (8/8/8: int, long und Zeiger sind 64-Bit) nur auf einigen frühen 64-Bit-Unix-Systemen (z. B. UNICOS auf Cray).
[bearbeiten] Anmerkungen
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_unicode_characters |
200704L |
(C++11) | Neue Zeichentypen (char16_t und char32_t) |
__cpp_char8_t |
201811L |
(C++20) | char8_t |
202207L |
(C++23) | char8_t-Kompatibilität und Portabilitätsfix (Initialisierung von (unsigned) char-Arrays aus UTF-8-Stringliteralen erlaubt) |
[bearbeiten] Schlüsselwörter
void, bool, true, false, char, char8_t, char16_t, char32_t, wchar_t, int, short, long, signed, unsigned, float, double
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| CWG 238 | C++98 | Die Einschränkungen für eine Gleitkomma-Implementierung waren nicht spezifiziert | spezifiziert als keine Einschränkung |
| CWG 1759 | C++11 | char kann die UTF-8-Code-Einheit 0x80 nicht garantiert darstellen | garantiert |
| CWG 2689 | C++11 | cv-qualifiziertes std::nullptr_t war kein grundlegender Typ | sie ist |
| CWG 2723 | C++98 | Die Bereiche der darstellbaren Werte für Gleitkommatypen waren nicht spezifiziert | spezifiziert |
| P2460R2 | C++98 | wchar_t musste alle Mitglieder in eigenen Codes darstellen können des größten erweiterten Zeichensatzes, der unter den unterstützten Locales angegeben ist |
nicht erforderlich. |
[bearbeiten] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 6.8.2 Grundlegende Typen [basic.fundamental]
- C++20 Standard (ISO/IEC 14882:2020)
- 6.8.1 Grundlegende Typen [basic.fundamental]
- C++17 Standard (ISO/IEC 14882:2017)
- 6.9.1 Grundlegende Typen [basic.fundamental]
- C++14 Standard (ISO/IEC 14882:2014)
- 3.9.1 Grundlegende Typen [basic.fundamental]
- C++11 Standard (ISO/IEC 14882:2011)
- 3.9.1 Grundlegende Typen [basic.fundamental]
- C++03-Standard (ISO/IEC 14882:2003)
- 3.9.1 Grundlegende Typen [basic.fundamental]
- C++98 Standard (ISO/IEC 14882:1998)
- 3.9.1 Grundlegende Typen [basic.fundamental]
[bearbeiten] Siehe auch
- Übersicht über das C++-Typsystem
- Konstante und flüchtige (cv) Spezifizierer und Qualifikatoren
- Speicherdauer-Spezifizierer
| C-Dokumentation für arithmetische Typen
|