Namespaces
Variants

Fundamental types

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

(Siehe auch type für eine Übersicht des Typsystems und the list of type-related utilities die von der C++-Bibliothek bereitgestellt werden)

Die folgenden Typen werden zusammen als fundamental types bezeichnet:

  • (möglicherweise cv-qualifiziert) void
(seit C++11)

Inhaltsverzeichnis

void

void — ein Typ mit einer leeren Wertemenge. Es ist ein unvollständiger Typ , der nicht vervollständigt werden kann (daher sind Objekte vom Typ void unzulässig). Es gibt keine Arrays von void , noch Referenzen auf void . Allerdings sind Zeiger auf void und Funktionen , die den Typ void zurückgeben ( Prozeduren in anderen Sprachen), erlaubt.

std::nullptr_t

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

std::nullptr_t ist der Typ des Nullzeigerliterals nullptr . Es ist ein eigener Typ, der selbst kein Zeigertyp und kein Zeiger-auf-Mitglied-Typ ist. Alle seine PRValues sind Nullzeigerkonstanten .

sizeof ( std:: nullptr_t ) ist gleich sizeof ( void * ) .

(seit C++11)

Ganzzahlige Typen

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 garantiert, dass es eine Breite von mindestens 16 Bit hat. Auf 32/64-Bit-Systemen ist jedoch fast ausschließlich garantiert, dass es eine Breite von mindestens 32 Bit hat (siehe unten).
Modifikatoren

Modifiziert den grundlegenden Ganzzahltyp. Kann in beliebiger Reihenfolge kombiniert werden. Nur ein Modifikator aus jeder Gruppe kann im Typnamen vorhanden sein.

  • Vorzeichenbehaftetheit:
signed — der Zieltyp hat eine vorzeichenbehaftete Darstellung (dies ist die Standardeinstellung, falls weggelassen)
unsigned — der Zieltyp hat eine vorzeichenlose Darstellung
  • Größe:
short — der Zieltyp wird für Speicherplatz optimiert und wird eine Breite von mindestens 16 Bit haben.
long — der Zieltyp wird eine Breite von mindestens 32 Bit haben.

long long — der Zieltyp wird mindestens 64 Bit breit sein.
(seit C++11)

Hinweis: Wie bei allen Typspezifizierern ist jede Reihenfolge erlaubt: unsigned long long int und long int unsigned long bezeichnen denselben Typ.

Eigenschaften

Die folgende Tabelle fasst alle verfügbaren Standard-Ganzzahltypen und ihre Eigenschaften in verschiedenen gebräuchlichen Datenmodellen zusammen:

**Anmerkung:** Der Text innerhalb der ` ` Tags wurde nicht übersetzt, da es sich um C++-Code handelt. Die HTML-Struktur und Formatierung bleiben vollständig erhalten.
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 Ganzzahlarithmetik ist für vorzeichenbehaftete und vorzeichenlose Ganzzahltypen unterschiedlich definiert. Siehe arithmetische Operatoren , insbesondere Ganzzahlü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 implementierungsdefiniert. Beachten Sie, dass Festbreiten-Ganzzahltypen typischerweise Aliase der Standard-Ganzzahltypen sind.

(seit C++11)

Boolescher Typ

bool — Ganzzahltyp, der einen von zwei Werten halten kann: true oder false . Der Wert von sizeof ( bool ) ist implementierungsdefiniert und kann von 1 abweichen.

Zeichentypen

Zeichentypen sind ganzzahlige Typen, die zur Zeichendarstellung verwendet werden.

signed char — Typ für die Darstellung vorzeichenbehafteter Zeichen.
unsigned char — Typ für die Darstellung vorzeichenloser Zeichen. Wird auch zur Untersuchung von Objektrepräsentationen (roher Speicher) verwendet.
char — Typ für die Zeichendarstellung, der auf dem Zielsystem am effizientesten verarbeitet werden kann (hat dieselbe 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 Codeeinheiten. Für jeden Wert des Typs unsigned char im Bereich [ 0 , 255 ] erzeugt die Konvertierung des Werts zu char und zurück zu 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 breiter Zeichen (siehe breite Zeichenketten ). Es hat dieselbe Größe, Vorzeichenbehaftung und Ausrichtung wie einer der Ganzzahltypen, ist aber ein eigenständiger Typ. In der Praxis ist es unter Linux und vielen anderen Nicht-Windows-Systemen 32 Bit groß und enthält UTF-32, unter Windows jedoch 16 Bit und enthält UTF-16-Codeeinheiten. Der Standard forderte früher, dass wchar_t groß genug sein muss, um jeden unterstützten Zeichencode darzustellen. Diese Anforderung konnte unter Windows jedoch nicht erfüllt werden und wurde daher als Defekt betrachtet und entfernt.

char16_t — Typ für UTF-16-Zeichendarstellung, muss groß genug sein, um jede UTF-16-Codeeinheit (16 Bit) darzustellen. Hat dieselbe Größe, Vorzeichenbehaftung und Ausrichtung wie std::uint_least16_t , ist jedoch ein distincter Typ.

char32_t — Typ für UTF-32-Zeichendarstellung, muss groß genug sein, um jede UTF-32-Codeeinheit (32 Bit) darzustellen. Hat dieselbe Größe, Vorzeichenbehaftung und Ausrichtung wie std::uint_least32_t , ist jedoch ein distincter Typ.
(seit C++11)

char8_t — Typ für UTF-8-Zeichendarstellung, muss groß genug sein, um jede UTF-8-Codeeinheit (8 Bit) darzustellen. Hat dieselbe Größe, Vorzeichenbehaftung und Ausrichtung wie unsigned char (und daher dieselbe Größe und Ausrichtung wie char und signed char ), ist jedoch ein eigenständiger Typ.
(seit C++20)

Neben den minimalen Bitanzahlen garantiert der C++-Standard, dass

1 == sizeof ( char ) sizeof ( short ) sizeof ( int ) sizeof ( long ) sizeof ( long long ) .
**Anmerkung:** Der Text wurde gemäß den Vorgaben übersetzt: - HTML-Tags und Attribute unverändert belassen - Text innerhalb von -Tags nicht übersetzt (≤ Zeichen) - C++-spezifische Begriffe (sizeof, char, short, int, long) nicht übersetzt - Die numerische Konstante 1 und Operatoren (==) beibehalten - Nur der strukturelle/deutsche Text außerhalb der Codebereiche wurde übersetzt

Hinweis: Dies erlaubt den Extremfall, in dem Bytes 64 Bit groß sind, alle Typen (einschließlich char ) 64 Bit breit sind, und sizeof für jeden Typ 1 zurückgibt.

Gleitkommatypen

Standard-Gleitkommatypen

Die folgenden drei Typen und ihre cv-qualifizierten Versionen werden zusammen als Standard-Gleitkommatypen bezeichnet.

float — Gleitkommatyp mit einfacher Genauigkeit. Üblicherweise im IEEE-754 binary32-Format .
double — Gleitkommatyp mit doppelter Genauigkeit. Üblicherweise im IEEE-754 binary64-Format .
long double — Gleitkommatyp mit erweiterter Genauigkeit. Muss nicht zwingend den von IEEE-754 vorgeschriebenen Typen entsprechen.

Erweiterte Gleitkommatypen

Die erweiterten Gleitkommatypen sind implementierungsdefiniert. Sie können Festbreiten-Gleitkommatypen enthalten.

(seit C++23)

Eigenschaften

Gleitkommatypen können spezielle Werte unterstützen:

  • Unendlichkeit (positiv und negativ), siehe INFINITY
  • die negative Null , - 0.0 . Sie vergleicht gleich mit der positiven Null, ist jedoch in einigen arithmetischen Operationen bedeutungsvoll, z.B. 1.0 / 0.0 == INFINITY , aber 1.0 / - 0.0 == - INFINITY ), und für einige mathematische Funktionen, z.B. sqrt (std::complex)
  • Keine-Zahl (NaN), die mit nichts (einschließlich sich selbst) gleich vergleicht. Mehrere Bitmuster repräsentieren NaNs, siehe std::nan , NAN . Beachten Sie, dass C++ keine besondere Beachtung von signalisierenden NaNs schenkt, außer der Erkennung ihrer Unterstützung durch std::numeric_limits::has_signaling_NaN , und behandelt alle NaNs als stille.

Fließkommazahlen können mit arithmetischen Operatoren + , - , / und * sowie verschiedenen mathematischen Funktionen aus <cmath> verwendet werden. Sowohl eingebaute Operatoren als auch Bibliotheksfunktionen können Fließkomma-Ausnahmen auslösen und errno setzen, wie in math errhandling beschrieben.

Gleitkommaausdrücke können einen größeren Bereich und höhere Genauigkeit aufweisen als durch ihre Typen angegeben, siehe FLT_EVAL_METHOD . Gleitkommaausdrücke können auch kontrahiert werden, das heißt, sie werden berechnet, als ob alle Zwischenwerte unendlichen Bereich und unendliche Genauigkeit hätten, siehe #pragma STDC FP_CONTRACT . Der C++-Standard schränkt die Genauigkeit von Gleitkommaoperationen nicht ein.

Einige Operationen mit Gleitkommazahlen werden beeinflusst von und verändern den Zustand von der Gleitkomma-Umgebung (insbesondere die Rundungsrichtung).

Implizite Konvertierungen sind zwischen Gleitkommatypen und Ganzzahltypen definiert.

Siehe limits of floating-point types und std::numeric_limits für zusätzliche Details, Grenzwerte und Eigenschaften der Gleitkommatypen.

Wertebereich

Die folgende Tabelle bietet eine Referenz für die Grenzen gängiger numerischer Darstellungen.

Vor C++20 erlaubte der C++-Standard jede beliebige Darstellung vorzeichenbehafteter Ganzzahlen, und der minimal garantierte Wertebereich für N-Bit vorzeichenbehaftete Ganzzahlen war von -(2 N-1
-1)
bis +2 N-1
-1
(z.B. −127 bis 127 für einen vorzeichenbehafteten 8-Bit-Typ), was den Grenzwerten von Einerkomplement oder Vorzeichen und Betrag entspricht.

Allerdings verwenden alle C++-Compiler die Zweierkomplement -Darstellung, und seit C++20 ist dies die einzige vom Standard zugelassene Darstellung, mit dem garantierten Bereich von -2 N-1
bis +2 N-1
-1
(z.B. −128 bis 127 für einen vorzeichenbehafteten 8-Bit-Typ).

8-Bit-Einerkomplement- und Vorzeichen-Betrags-Darstellungen für char sind seit C++11 nicht mehr zulässig (durch die Lösung von CWG Issue 1759 ), weil eine UTF-8-Codeeinheit mit dem Wert 0x80, die in einem UTF-8-Stringliteral verwendet wird, in einem Objekt vom Typ char speicherbar sein muss.

Der Bereich für einen Gleitkommatyp T ist wie folgt definiert:

  • Der minimal garantierte Bereich ist die negativste endliche Fließkommazahl, die in T darstellbar ist, bis hin zur positivsten endlichen Fließkommazahl, die in T darstellbar ist.
  • Falls negative Unendlichkeit in T darstellbar ist, wird der Bereich von T auf alle negativen reellen Zahlen erweitert.
  • Falls positive Unendlichkeit in T darstellbar ist, wird der Bereich von T auf alle positiven reellen Zahlen erweitert.

Da negative und positive Unendlichkeiten in ISO/IEC/IEEE 60559 Formaten darstellbar sind, liegen alle reellen Zahlen innerhalb des darstellbaren Wertebereichs 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 · 10 4 −32768 bis 32767
unsigned 0 bis 6.55 · 10 4 0 bis 65535
32 signed ± 2.14 · 10 9 −2,147,483,648 bis 2,147,483,647
unsigned 0 bis 4.29 · 10 9 0 bis 4,294,967,295
64 signed ± 9.22 · 10 18 −9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807
unsigned 0 bis 1.84 · 10 19 0 bis 18,446,744,073,709,551,615
Binär-
Gleitkomma-
zahl
32 IEEE-754
  • minimaler subnormaler Wert:
    ± 1.401,298,4 · 10 −45
  • minimaler normaler Wert:
    ± 1.175,494,3 · 10 −38
  • maximaler Wert:
    ± 3.402,823,4 · 10 38
  • minimaler subnormaler Wert:
    ±0x1p−149
  • minimaler normaler Wert:
    ±0x1p−126
  • maximaler Wert:
    ±0x1.fffffep+127
64 IEEE-754
  • minimaler subnormaler Wert:
    ± 4.940,656,458,412 · 10 −324
  • minimaler normaler Wert:
    ± 2.225,073,858,507,201,4 · 10 −308
  • maximaler Wert:
    ± 1.797,693,134,862,315,7 · 10 308
  • minimaler subnormaler Wert:
    ±0x1p−1074
  • minimaler normaler Wert:
    ±0x1p−1022
  • maximaler Wert:
    ±0x1.fffffffffffffp+1023
80 [Anmerkung 1] x86
  • minimaler subnormaler Wert:
    ± 3.645,199,531,882,474,602,528
    · 10 −4951
  • minimaler normaler Wert:
    ± 3.362,103,143,112,093,506,263
    · 10 −4932
  • maximaler Wert:
    ± 1.189,731,495,357,231,765,021
    · 10 4932
  • minimaler subnormaler Wert:
    ±0x1p−16445
  • minimaler normaler Wert:
    ±0x1p−16382
  • maximaler Wert:
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • minimaler subnormaler Wert:
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10 −4966
  • minimaler normaler Wert:
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10 −4932
  • maximaler Wert:
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 10 4932
  • minimaler subnormaler Wert:
    ±0x1p−16494
  • minimaler normaler Wert:
    ±0x1p−16382
  • maximaler Wert:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. Die Objektdarstellung belegt üblicherweise 96/128 Bits auf 32/64-Bit-Plattformen entsprechend.

Hinweis: Die tatsächlichen (im Gegensatz zu den garantierten minimalen) Grenzwerte der durch diese Typen darstellbaren Werte sind verfügbar in der C-Numerik-Grenzwerte-Schnittstelle und std::numeric_limits .

Datenmodelle

Die Entscheidungen jeder Implementierung bezüglich der Größen der fundamentalen Typen werden zusammen 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 ILP64 ( 8/8/8 : int , long , und Zeiger sind 64-Bit) erschien nur in einigen frühen 64-Bit-Unix-Systemen (z.B. UNICOS auf Cray ).

Hinweise

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äts- und Portabilitätskorrektur ( Initialisierung von (unsigned) char Arrays erlauben aus UTF-8 Zeichenkettenliteralen )

Schlüsselwörter

void , bool , true , false , char , char8_t , char16_t , char32_t , wchar_t , int , short , long , signed , unsigned , float , double

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 war nicht garantiert, UTF-8-Codeeinheit 0x80 darstellen zu können garantiert
CWG 2689 C++11 cv-qualifiziertes std::nullptr_t war kein fundamentaler Typ ist es
CWG 2723 C++98 die Bereiche der darstellbaren Werte für Gleitkommatypen waren nicht spezifiziert spezifiziert
P2460R2 C++98 wchar_t musste in der Lage sein, distinct codes für alle Mitglieder
des größten erweiterten Zeichensatzes der unterstützten Locales darzustellen
nicht erforderlich

Referenzen

  • C++23-Standard (ISO/IEC 14882:2024):
  • 6.8.2 Fundamentale Typen [basic.fundamental]
  • C++20 Standard (ISO/IEC 14882:2020):
  • 6.8.1 Fundamentale Typen [basic.fundamental]
  • C++17-Standard (ISO/IEC 14882:2017):
  • 6.9.1 Fundamentale Typen [basic.fundamental]
  • C++14-Standard (ISO/IEC 14882:2014):
  • 3.9.1 Fundamentale Typen [basic.fundamental]
  • C++11-Standard (ISO/IEC 14882:2011):
  • 3.9.1 Fundamentale Typen [basic.fundamental]
  • C++03-Standard (ISO/IEC 14882:2003):
  • 3.9.1 Fundamentale Typen [basic.fundamental]
  • C++98-Standard (ISO/IEC 14882:1998):
  • 3.9.1 Fundamentale Typen [basic.fundamental]

Siehe auch

C-Dokumentation für arithmetic types