Namensräume
Varianten
Aktionen

Fundamentale Typen

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Fundamentale Typen
Aufzählungstypen
Funktionstypen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

(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

Definiert in Header <cstddef>
typedef decltype(nullptr) nullptr_t;
(seit C++11)

std::nullptr_t ist der Typ des Nullzeiger-Literals, nullptr. Es ist ein eigenständiger Typ, der selbst weder ein Zeigertyp noch ein Zeiger auf ein Member ist. Alle seine prvalues sind Nullzeiger-Konstanten.

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.

long long — der Zieltyp hat eine Breite von mindestens 64 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 Ganzzahltypen

Die 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: true oder false. 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 [0255], 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.

char16_t — Typ für die Darstellung von UTF-16-Zeichen, muss groß genug sein, um jede UTF-16-Code-Einheit (16 Bit) darzustellen. Er hat die gleiche Größe, Vorzeichenbehaftung und Ausrichtung wie std::uint_least16_t, ist aber ein eigenständiger Typ.

char32_t — Typ für die Darstellung von UTF-32-Zeichen, muss groß genug sein, um jede UTF-32-Code-Einheit (32 Bit) darzustellen. Er hat die gleiche Größe, Vorzeichenbehaftung und Ausrichtung wie std::uint_least32_t, ist aber ein eigenständiger Typ.
(seit C++11)

char8_t — Typ für die Darstellung von UTF-8-Zeichen, muss groß genug sein, um jede UTF-8-Code-Einheit (8 Bit) darzustellen. Er hat die gleiche Größe, Vorzeichenbehaftung und Ausrichtung wie unsigned char (und damit die gleiche Größe und Ausrichtung wie char und signed char), ist aber ein eigenständiger Typ.
(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.

Erweiterte Gleitkommatypen

Die 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 T darstellbar ist, bis zur positivsten endlichen Gleitkommazahl, die in T darstellbar ist.
  • Wenn negative Unendlichkeit in T darstellbar ist, wird der Bereich von T auf alle negativen reellen Zahlen erweitert.
  • Wenn positive Unendlichkeit in T darstellbar ist, wird der Bereich von T auf 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
  • minimaler Subnormaler
    ± 1.401,298,4 · 10−45
  • minimaler Normaler
    ± 1.175,494,3 · 10−38
  • max
    ± 3.402,823,4 · 1038
  • minimaler Subnormaler
    ±0x1p−149
  • minimaler Normaler
    ±0x1p−126
  • max
    ±0x1.fffffep+127
64 IEEE-754
  • minimaler Subnormaler
    ± 4.940,656,458,412 · 10−324
  • minimaler Normaler
    ± 2.225,073,858,507,201,4 · 10−308
  • max
    ± 1.797,693,134,862,315,7 · 10308
  • minimaler Subnormaler
    ±0x1p−1074
  • minimaler Normaler
    ±0x1p−1022
  • max
    ±0x1.fffffffffffffp+1023
80[Anm. 1] x86
  • minimaler Subnormaler
    ± 3.645,199,531,882,474,602,528
     · 10−4951
  • minimaler Normaler
    ± 3.362,103,143,112,093,506,263
     · 10−4932
  • max
    ± 1.189,731,495,357,231,765,021
     · 104932
  • minimaler Subnormaler
    ±0x1p−16445
  • minimaler Normaler
    ±0x1p−16382
  • max
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • minimaler Subnormaler
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10−4966
  • minimaler Normaler
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10−4932
  • max
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 104932
  • minimaler Subnormaler
    ±0x1p−16494
  • minimaler Normaler
    ±0x1p−16382
  • max
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. 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)
  • 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

C-Dokumentation für arithmetische Typen