Arithmetic types
(Siehe auch type für einen Überblick über das Typsystem und die Liste der typrelevanten Hilfsmittel die von der C-Bibliothek bereitgestellt werden.)
Boolean-TypBeachten 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 )
|
(seit C99) |
|
(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 ) .
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 ).
|
(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 GleitkommatypenKomplexe 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.
Diesen Code ausführen
Ausgabe: 1/(1.0+2.0i) = 0.2-0.4i
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.
Komplexe Zahlen können mit
arithmetischen Operatoren
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").
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).
Diesen Code ausführen
#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 GleitkommatypenImaginä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.
Diesen Code ausführen
Ausgabe: 1/(3.0i) = -0.3i
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
Inkrement und Dekrement sind für imaginäre Typen nicht definiert.
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
- bool , true , false , char , int , short , long , signed , unsigned , float , double .
- _Bool , _BitInt , _Complex , _Imaginary , _Decimal32 , _Decimal64 , _Decimal128 .
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 |
|
|
| 64 | IEEE-754 |
|
|
|
| 80 [Anm. 1] | x86 |
|
|
|
| 128 | IEEE-754 |
|
|
|
|
Dezimal-
Gleitkomma- zahl |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
||
| 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) Wertebereiche sind in den Bibliotheks-Headern <limits.h> und <float.h> verfügbar.
Siehe auch
|
C++ Dokumentation
für
Fundamental types
|