Namespaces
Variants

Arithmetic types

From cppreference.net

(Siehe auch type für einen Überblick über das Typsystem und die Liste der typrelevanten Hilfsmittel die von der C-Bibliothek bereitgestellt werden.)

Inhaltsverzeichnis

Boolean-Typ

  • _Bool (auch zugänglich als Makro bool ) (bis C23) bool (seit C23) — Typ, der einen der zwei Werte halten kann: 1 und 0 (auch zugänglich als Makros true und false ) (bis C23) true und false (seit C23) .

Beachten Sie, dass Konvertierung zu _Bool (bis C23) bool (seit C23) nicht gleich funktioniert wie Konvertierung zu anderen Ganzzahltypen: ( bool ) 0.5 ergibt true , wohingegen ( int ) 0.5 zu 0 ausgewertet wird.

(seit C99)

Zeichentypen

  • 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. Entspricht entweder signed char oder unsigned char (welches davon, ist implementierungsdefiniert und kann durch einen Compiler-Kommandozeilenschalter gesteuert werden), aber char ist ein eigenständiger Typ, verschieden von sowohl signed char als auch unsigned char .

Beachten Sie, dass die Standardbibliothek auch typedef -Namen definiert: wchar_t , char16_t und char32_t (seit C11) zur Darstellung von Breitzeichen sowie char8_t für UTF-8-Zeichen (seit C23) .

Ganzzahlige Typen

  • short int (auch zugänglich als short , kann das Schlüsselwort signed verwenden)
  • unsigned short int (auch zugänglich als unsigned short )
  • int (auch zugänglich als signed int )
Dies ist der optimalste Integer-Typ für die Plattform und garantiert mindestens 16 Bit. Die meisten aktuellen Systeme verwenden 32 Bit (siehe Datenmodelle unten).
  • unsigned int (auch zugänglich als unsigned ), das vorzeichenlose Gegenstück zu int , implementiert Modulo-Arithmetik. Geeignet für Bit-Manipulationen.
  • long int (auch zugänglich als long )
  • unsigned long int (auch zugänglich als unsigned long )
  • long long int (auch zugänglich als long long )
  • unsigned long long int (auch zugänglich als unsigned long long )
(seit C99)
  • _BitInt ( n ) (auch zugänglich als signed _BitInt ( n ) ), die bitgenauen vorzeichenbehafteten Ganzzahltypen (wobei n durch einen ganzzahligen konstanten Ausdruck ersetzt wird, der die genaue Breite (einschließlich des Vorzeichenbits) bezeichnet, die nicht größer als BITINT_MAXWIDTH aus <limits.h> sein kann)
  • unsigned _BitInt ( n ) , die bitgenauen vorzeichenlosen Ganzzahltypen (wobei n durch einen ganzzahligen konstanten Ausdruck ersetzt wird, der die genaue Breite bezeichnet, die nicht größer als BITINT_MAXWIDTH aus <limits.h> sein kann)
(seit C23)

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

Die folgende Tabelle fasst alle verfügbaren Ganzzahltypen und ihre Eigenschaften zusammen:

Typspezifizierer Entsprechender Typ Breite in Bits nach Datenmodell
C-Standard LP32 ILP32 LLP64 LP64
char
char mindestens
8
8 8 8 8
signed char
signed char
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
(C99)
mindestens
64
64 64 64 64
long long int
signed long long
signed long long int
unsigned long long
unsigned long long int
(C99)
unsigned long long int

Neben den minimalen Bitanzahlen garantiert der C-Standard, dass

1 == sizeof ( char ) sizeof ( short ) sizeof ( int ) sizeof ( long ) sizeof ( long long ) .
**Anmerkung:** Die Übersetzung war in diesem Fall nicht erforderlich, da der gesamte Inhalt innerhalb von Code-Tags oder C++-spezifischen Begriffen steht, die gemäß den Anweisungen nicht übersetzt werden sollten. Die HTML-Struktur und Formatierung wurden originalgetreu beibehalten.

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

Hinweis: Die Ganzzahlarithmetik ist für vorzeichenbehaftete und vorzeichenlose Ganzzahltypen unterschiedlich definiert. Siehe arithmetische Operatoren , insbesondere Ganzzahlüberläufe .

Datenmodelle

Die von jeder Implementierung getroffenen Entscheidungen über die Größen der fundamentalen Typen werden gemeinsam 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, Mac OS X)

64-Bit-Systeme:

  • LLP64 oder 4/4/8 ( int und long sind 32-Bit, Zeiger ist 64-Bit)
  • Win64 API
  • LP64 oder 4/8/8 ( int ist 32-Bit, long und Zeiger sind 64-Bit)
  • Unix und Unix-ähnliche Systeme (Linux, Mac OS X)

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 ).

Beachten Sie, dass Ganzzahltypen mit exakter Breite in <stdint.h> seit C99 verfügbar sind.

Reelle Gleitkommatypen

C hat drei oder sechs (seit C23) Typen zur Darstellung von reellen Gleitkommawerten:

  • float — Gleitkommatyp mit einfacher Genauigkeit. Entspricht dem IEEE-754 binary32-Format falls unterstützt.
  • double — Gleitkommatyp mit doppelter Genauigkeit. Entspricht dem IEEE-754 binary64 -Format falls unterstützt.
  • long double — Gleitkommatyp mit erweiterter Genauigkeit. Entspricht dem IEEE-754 binary128 -Format falls unterstützt, andernfalls entspricht es dem IEEE-754 binary64 -erweiterten Format falls unterstützt, andernfalls entspricht es einem nicht-IEEE-754-erweiterten Gleitkommaformat, solange dessen Genauigkeit besser als binary64 ist und der Wertebereich mindestens so gut wie binary64 ist, andernfalls entspricht es dem IEEE-754 binary64 -Format.
    • binary128 -Format wird von einigen HP-UX-, SPARC-, MIPS-, ARM64- und z/OS-Implementierungen verwendet.
    • Das bekannteste IEEE-754 binary64 -erweiterte Format ist das 80-Bit-x87-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 ).
Falls die Implementierung die Makrokonstante __STDC_IEC_60559_DFP__ vordefiniert, werden die folgenden Dezimal-Gleitkommatypen ebenfalls unterstützt.
Andernfalls werden diese Dezimal-Gleitkommatypen nicht unterstützt.
(seit C23)

Gleitkommatypen können spezielle Werte unterstützen:

  • Unendlich (positiv und negativ), siehe INFINITY
  • die negative Null , - 0.0 . Sie vergleicht sich gleich mit der positiven Null, ist jedoch bei einigen arithmetischen Operationen bedeutsam, z.B. 1.0 / 0.0 == INFINITY , aber 1.0 / - 0.0 == - INFINITY )
  • Keine-Zahl (NaN), die sich mit nichts vergleicht (einschließlich sich selbst). Mehrere Bitmuster repräsentieren NaNs, siehe nan , NAN . Beachten Sie, dass C keine besondere Beachtung von signalisierenden NaNs schenkt (spezifiziert durch IEEE-754) und alle NaNs als stille behandelt.

Reelle Gleitkommazahlen können mit arithmetischen Operatoren + - / * und verschiedenen mathematischen Funktionen aus <math.h> verwendet werden. Sowohl eingebaute Operatoren als auch Bibliotheksfunktionen können Gleitkomma-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 . Assignment , return , und cast erzwingen den Bereich und die Genauigkeit auf diejenige, die mit dem deklarierten Typ assoziiert ist.

Gleitkommaausdrücke können auch kontrahiert werden, das heißt, sie werden so berechnet, als ob alle Zwischenwerte unendlichen Wertebereich und unendliche Genauigkeit hätten, siehe #pragma STDC FP_CONTRACT .

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

Implizite Konvertierungen sind zwischen Gleitkommatypen und Ganzzahl-, komplexen und imaginären Typen definiert.

Siehe Limits of floating-point types und die <math.h> Bibliothek für zusätzliche Details, Grenzwerte und Eigenschaften der Gleitkommatypen.

Komplexe Gleitkommatypen

Komplexe Gleitkommatypen modellieren die mathematischen komplexen Zahlen , das heißt Zahlen, die als Summe einer reellen Zahl und einer reellen Zahl multipliziert mit der imaginären Einheit geschrieben werden können: a + bi

Die drei komplexen Typen sind

Hinweis: Wie bei allen Typspezifizierern ist jede Reihenfolge erlaubt: long double complex , complex long double , und sogar double complex long bezeichnen denselben Typ.

#include <complex.h>
#include <stdio.h>
int main(void)
{
    double complex z = 1 + 2*I;
    z = 1 / z;
    printf("1/(1.0+2.0i) = %.1f%+.1fi\n", creal(z), cimag(z));
}

Ausgabe:

1/(1.0+2.0i) = 0.2-0.4i

Falls die Makrokonstante __STDC_NO_COMPLEX__ durch die Implementierung definiert ist, werden die komplexen Typen (sowie die Bibliotheks-Header-Datei <complex.h> ) nicht bereitgestellt.

(seit C11)

Jeder komplexe Typ hat dieselbe Objektdarstellung und Ausrichtungsanforderungen wie ein Array von zwei Elementen des entsprechenden reellen Typs ( float für float complex , double für double complex , long double für long double complex ). Das erste Element des Arrays enthält den Realteil und das zweite Element des Arrays enthält den Imaginärteil.

float a[4] = {1, 2, 3, 4};
float complex z1, z2;
memcpy(&z1, a, sizeof z1); // z1 wird zu 1.0 + 2.0i
memcpy(&z2, a+2, sizeof z2); // z2 wird zu 3.0 + 4.0i

Komplexe Zahlen können mit arithmetischen Operatoren + - * und / verwendet werden, möglicherweise gemischt mit imaginären und reellen Zahlen. Es sind viele mathematische Funktionen für komplexe Zahlen in <complex.h> definiert. Sowohl eingebaute Operatoren als auch Bibliotheksfunktionen können Gleitkomma-Ausnahmen auslösen und errno setzen, wie beschrieben in math_errhandling .

Inkrement und Dekrement sind für komplexe Typen nicht definiert.

Relationale Operatoren sind für komplexe Typen nicht definiert (es gibt keine Vorstellung von "kleiner als").

Implizite Konvertierungen are defined between complex types and other arithmetic types.

Um das Ein-Unendlich-Modell der komplexen Zahlenarithmetik zu unterstützen, betrachtet C jeden komplexen Wert mit mindestens einem unendlichen Teil als eine Unendlichkeit, selbst wenn sein anderer Teil ein NaN ist, garantiert, dass alle Operatoren und Funktionen grundlegende Eigenschaften von Unendlichkeiten einhalten, und stellt cproj bereit, um alle Unendlichkeiten auf die kanonische abzubilden (siehe arithmetic operators für die genauen Regeln).

#include <complex.h>
#include <math.h>
#include <stdio.h>
int main(void)
{
    double complex z = (1 + 0*I) * (INFINITY + I*INFINITY);
//  textbook formula would give
//  (1+i0)(∞+i∞) ⇒ (1×∞ – 0×∞) + i(0×∞+1×∞) ⇒ NaN + I*NaN
//  but C gives a complex infinity
    printf("%f%+f*i\n", creal(z), cimag(z));
//  textbook formula would give
//  cexp(∞+iNaN) ⇒ exp(∞)×(cis(NaN)) ⇒ NaN + I*NaN
//  but C gives  ±∞+i*nan
    double complex y = cexp(INFINITY + I*NAN);
    printf("%f%+f*i\n", creal(y), cimag(y));
}

Mögliche Ausgabe:

inf+inf*i 
inf+nan*i

C behandelt auch mehrere Unendlichkeiten so, dass Richtungsinformationen wo möglich erhalten bleiben, trotz der inhärenten Grenzen der kartesischen Darstellung:

Multiplizieren der imaginären Einheit mit reeller Unendlichkeit ergibt die korrekt vorzeichenbehaftete imaginäre Unendlichkeit: i × ∞ = i∞. Ebenso zeigt i × (∞ – i∞) = ∞ + i∞ den vernünftigen Quadranten an.

Imaginäre Gleitkommatypen

Imaginäre Gleitkommatypen modellieren die mathematischen imaginären Zahlen , also Zahlen, die als eine reelle Zahl multipliziert mit der imaginären Einheit geschrieben werden können: bi Die drei imaginären Typen sind

Hinweis: Wie bei allen Typspezifizierern ist jede Reihenfolge erlaubt: long double imaginary , imaginary long double und sogar double imaginary long bezeichnen denselben Typ.

#include <complex.h>
#include <stdio.h>
int main(void)
{
    double imaginary z = 3*I;
    z = 1 / z;
    printf("1/(3.0i) = %+.1fi\n", cimag(z));
}

Ausgabe:

1/(3.0i) = -0.3i

Eine Implementierung, die __STDC_IEC_559_COMPLEX__ definiert, wird empfohlen, ist jedoch nicht verpflichtet, imaginäre Zahlen zu unterstützen. POSIX empfiehlt zu prüfen, ob das Makro _Imaginary_I definiert ist, um die Unterstützung imaginärer Zahlen zu identifizieren.

(bis C11)

Imaginäre Zahlen werden unterstützt, falls __STDC_IEC_559_COMPLEX__ (bis C23) __STDC_IEC_60559_COMPLEX__ (seit C23) definiert ist.

(seit C11)

Jeder der drei imaginären Typen hat dieselbe Objektdarstellung und Ausrichtungsanforderung wie sein entsprechender reeller Typ ( float für float imaginary , double für double imaginary , long double für long double imaginary ).

Hinweis: Trotzdem sind imaginäre Typen verschieden und nicht kompatibel mit ihren entsprechenden reellen Typen, was Aliasing verbietet.

Imaginäre Zahlen können mit arithmetischen Operatoren + - * und / verwendet werden, möglicherweise gemischt mit komplexen und reellen Zahlen. Es sind viele mathematische Funktionen für imaginäre Zahlen in <complex.h> definiert. Sowohl eingebaute Operatoren als auch Bibliotheksfunktionen können Gleitkomma-Ausnahmen auslösen und errno setzen, wie beschrieben in math_errhandling .

Inkrement und Dekrement sind für imaginäre Typen nicht definiert.

Implizite Konvertierungen are defined between imaginary types and other arithmetic types.

Die imaginären Zahlen ermöglichen es, alle komplexen Zahlen mit der natürlichen Notation x + I * y auszudrücken (wobei I als _Imaginary_I definiert ist). Ohne imaginäre Typen können bestimmte spezielle komplexe Werte nicht natürlich erzeugt werden. Beispielsweise, wenn I als _Complex_I definiert ist, dann ergibt das Schreiben von 0.0 + I * INFINITY NaN als Realteil, und CMPLX ( 0.0 , INFINITY ) muss stattdessen verwendet werden. Dasselbe gilt für Zahlen mit negativer Null als Imaginärteil, die bei der Arbeit mit Bibliotheksfunktionen mit Verzweigungsschnitten, wie csqrt , bedeutsam sind: 1.0 - 0.0 * I ergibt den positiven Null-Imaginärteil, wenn I als _Complex_I definiert ist, und der negative Null-Imaginärteil erfordert die Verwendung von CMPLX oder conj .

Imaginäre Typen vereinfachen auch Implementierungen; die Multiplikation eines Imaginärteils mit einem Komplex kann unkompliziert mit zwei Multiplikationen implementiert werden, wenn die imaginären Typen unterstützt werden, anstatt vier Multiplikationen und zwei Additionen.

(seit C99)

Schlüsselwörter

Wertebereich

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

Vor C23 erlaubte der C-Standard jede vorzeichenbehaftete Ganzzahldarstellung, und der minimal garantierte Bereich von N-Bit vorzeichenbehafteten 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 gängigen Datenmodelle (einschließlich ILP32, LP32, LP64, LLP64) und fast alle C-Compiler die Zweierkomplement-Darstellung (die einzigen bekannten Ausnahmen sind einige Compiler für UNISYS), und seit C23 ist es 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).

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
  • min subnormal:
    ± 1.401,298,4 · 10 −45
  • min normal:
    ± 1.175,494,3 · 10 −38
  • max:
    ± 3.402,823,4 · 10 38
  • min subnormal:
    ±0x1p−149
  • min normal:
    ±0x1p−126
  • max:
    ±0x1.fffffep+127
64 IEEE-754
  • min subnormal:
    ± 4.940,656,458,412 · 10 −324
  • min normal:
    ± 2.225,073,858,507,201,4 · 10 −308
  • max:
    ± 1.797,693,134,862,315,7 · 10 308
  • min subnormal:
    ±0x1p−1074
  • min normal:
    ±0x1p−1022
  • max:
    ±0x1.fffffffffffffp+1023
80 [Anm. 1] x86
  • min subnormal:
    ± 3.645,199,531,882,474,602,528
    · 10 −4951
  • min normal:
    ± 3.362,103,143,112,093,506,263
    · 10 −4932
  • max:
    ± 1.189,731,495,357,231,765,021
    · 10 4932
  • min subnormal:
    ±0x1p−16445
  • min normal:
    ±0x1p−16382
  • max:
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • min subnormal:
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10 −4966
  • min normal:
    ± 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 · 10 4932
  • min subnormal:
    ±0x1p−16494
  • min normal:
    ±0x1p−16382
  • max:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
Dezimal-
Gleitkomma-
zahl
32 IEEE-754
  • min subnormal:
    ± 1 · 10 -101
  • min normal:
    ± 1 · 10 -95
  • max:
    ± 9.999'999 · 10 96
64 IEEE-754
  • min subnormal:
    ± 1 · 10 -398
  • min normal:
    ± 1 · 10 -383
  • max:
    ± 9.999'999'999'999'999 · 10 384
128 IEEE-754
  • min subnormal:
    ± 1 · 10 -6176
  • min normal:
    ± 1 · 10 -6143
  • max:
    ± 9.999'999'999'999'999'999'
    999'999'999'999'999 · 10 6144
  1. Die Objektdarstellung belegt üblicherweise 96/128 Bits auf 32/64-Bit-Plattformen entsprechend.

Hinweis: Die tatsächlichen (im Gegensatz zu den garantierten minimalen) Wertebereiche sind in den Bibliotheks-Headern <limits.h> und <float.h> verfügbar.

Siehe auch

C++ Dokumentation für Fundamental types