Fundamental types
(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
std::nullptr_t
ist der Typ des Nullzeigerliterals
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.
|
|
(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:
| 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 GanzzahltypenDie 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:
trueoderfalse. 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.
|
|
(seit C++11) |
|
|
(seit C++20) |
Neben den minimalen Bitanzahlen garantiert der C++-Standard, dass
-
1
==
sizeof
(
char
)
≤sizeof ( short )≤sizeof ( int )≤sizeof ( long )≤sizeof ( long long ) .
-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.
- IEEE-754 binary128-Format wird von einigen HP-UX-, SPARC-, MIPS-, ARM64- und z/OS-Implementierungen verwendet.
- Das bekannteste IEEE-754 binary64-erweiterte Format ist das x87 80-Bit-Format mit erweiterter Genauigkeit . Es wird von vielen x86- und x86-64-Implementierungen verwendet (eine bemerkenswerte Ausnahme ist MSVC, das long double im selben Format wie double implementiert, d.h. binary64).
- Auf PowerPC kann Double-Double verwendet werden.
Erweiterte GleitkommatypenDie 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
Tdarstellbar ist, bis hin zur positivsten endlichen Fließkommazahl, die inTdarstellbar ist. -
Falls negative Unendlichkeit in
Tdarstellbar ist, wird der Bereich vonTauf alle negativen reellen Zahlen erweitert. -
Falls positive Unendlichkeit in
Tdarstellbar ist, wird der Bereich vonTauf 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 |
|
|
| 64 | IEEE-754 |
|
|
|
| 80 [Anmerkung 1] | x86 |
|
|
|
| 128 | IEEE-754 |
|
|
|
- ↑ 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)
-
- 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 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
- Überblick über das C++-Typsystem
- Const-Volatilitäts (cv)-Spezifizierer und Qualifizierer
- Speicherdauer-Spezifizierer
|
C-Dokumentation
für
arithmetic types
|