5.7 Ganzzahlige Typen mit vorgegebener Breite – <stdint.h>
Ab dem C99-Standard finden sich in der Headerdatei <stdint.h> weitere Ganzzahldatentypen, die mit vorgegebener Breite verwendet werden. Mit vorgegebener Breite ist die Anzahl der Bits zur Darstellung des Werts gemeint, die dieser Typ verwenden darf. Hier die Typen im Überblick:
Typ | Bedeutung |
intN_t uintN_t |
Ein int-Wert mit einer Breite von exakt N Bits. Dieser Typ ist optional und wird nicht vom C99-Standard gefordert. Damit wäre es beispielsweise möglich, eigene erweiterte Ganzzahltypen wie beispielsweise int22_t oder uint34_t zu definieren und zu verwenden. |
int_leastN_t uint_leastN_t |
ein int-Wert mit einer Breite von mindestens N Bits (erlaubte Werte für N: 8, 16, 32, 64) |
int_fastN_t uint_fastN_t |
der schnellste int-Typ mit mindestens einer Breite von N Bits (erlaubte Werte für N: 8, 16, 32, 64) |
intmax_t uintmax_t |
größtmöglicher ganzzahliger Typ (Sein Wert ist in der Konstante INT64_MAX bzw. UINT64_MAX deklariert.) |
intptr_t uintptr_t |
maximale Breite, um den Wert eines Zeigers zu speichern |
Typen, die mit u (unsigned) beginnen, sind vorzeichenlos. Von den in der Tabelle aufgelisteten Typen wiederum werden vom C99-Standard nur int_leastN_t, int_fastN_t und intmax_t und deren unsigned-Gegenstücke gefordert. Die anderen beiden Typen sind optional und müssen nicht implementiert sein. Die maximalen und minimalen Limits dieser Ganzzahltypen sind ebenfalls in der Headerdatei <stdint.h> deklariert. Bei den Namen der Limits brauchen Sie nur den Typnamen großschreiben und das Suffix _t gegen _MIN bzw. _MAX austauschen. So lautet beispielsweise der Makroname für den minimalen bzw. maximalen int_least32_t-Wert INT_LEAST32_MIN bzw, INT_LEAST32_MAX. Hierzu ein einfaches Listing als Beispiel:
/* stdint.c */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main(void) { int_least8_t i8; int_least32_t i32; int_least64_t i64; // beispielsweise Linux: -128 und 127 printf("int_least8_t/Max. : %d; Min : %d\n", INT_LEAST8_MAX, INT_LEAST8_MIN ); // beispielsweise Linux: -2147483648 und 2147483647 printf("int_least32_t/Max.: %d; Min : %d\n", INT_LEAST32_MIN, INT_LEAST32_MAX ); // beispielsweise Linux: -9223372036854775808 und // 9223372036854775807 printf("int_least64_t/Max.: %lld; Min: %lld\n", INT_LEAST64_MIN, INT_LEAST64_MAX ); return EXIT_SUCCESS; }
Hinweis |
Um diese Typen verwenden zu können, muss Ihr Compiler dem C99-Standard entsprechen. |
Hinweis |
Spezielle Konvertierungspezifizierer, die im Formatstring von printf() bzw. scanf() verwendet werden, gibt es in <stdint.h> nicht. Aber in der Headerdatei <inttypes.h> sind für Makros spezielle Stringliterale definiert. |
Im Grunde sind diese erweiterten Typen in der Headerdatei <stdint.h> nur Synonyme für Standardtypen. So sind beispielsweise in <stdin.h> folgende Zeilen enthalten:
// ... typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; // ...
Abhängig von der Wortgröße ist dann beispielsweise int_least64_t als long int oder long long int implementiert.
5.7.1 <inttypes.h> (C99)
Auch der Header <inttypes.h> inkludiert die Headerdatei <stdint.h> und verwendet hier die ganzzahligen Datentypen mit einer bestimmten Breite – ganz besonders die Typen intmax_t und uintmax_t, womit die größtmöglichen Typen dargestellt werden.
Neben einigen Funktionen beinhaltet diese Headerdatei auch Makros, die als Konvertierungsspezifizierer im Formatstring von printf() und scanf() verwendet werden können. Hierfür gibt es für jeden in <stdint.h> definierten Typ bestimmter Breite ein entsprechendes Makro mit dem Präfix PRI (für printf()) oder SCN (für scanf()), gefolgt vom Konvertierungspezifizierer d, i, o oder x und dem Typnamen. Im Falle von beispielsweise int_least8_t sehen die Konvertierungsspezifizierer für printf() und scanf() wie folgt aus:
SCNdLEAST8 // für scanf() PRIdLEAST8 // für printf()
Oder für den Typ int_fast32_t:
SCNdFAST32 // für scanf() PRIdFAST32 // für printf()
In der Praxis sieht die Verwendung der Konvertierungsspezifizierer für Typen einer bestimmten Breite, die in der Headerdatei <inttypes.h> als Makro definiert sind, wie folgt aus:
/* inttypes.c */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <inttypes.h> int main(void) { int_least8_t i8; int_least32_t i32; printf("Wert für int_least8_t eingeben : "); scanf("%" SCNdLEAST8 , &i8 ); printf("Wert für int_least32_t eingeben: "); scanf("%" SCNdLEAST32 , &i32 ); printf("i8 : " "%10" PRIdLEAST8 "\n", i8 ); printf("i32 : " "%10" PRIdLEAST32 "\n", i32 ); return EXIT_SUCCESS; }
Die Konvertierung funktioniert hier mit einer Verkettung der Stringliterale "%" und dem entsprechenden Konvertierungsspezifizierer.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.