Größe von int in C auf verschiedenen Architekturen
-
05-07-2019 - |
Frage
Ich bin mir bewusst, dass die Spezifikation der Sprache C nicht die genaue Größe jeden Integer-Typs diktieren wird (zum Beispiel int
).
Was ich frage mich, ist: Gibt es eine Möglichkeit in C (nicht C ++) einen Integer-Typ mit einer bestimmten Größe zu definieren, es wird die gleiche über verschiedene Architekturen gewährleistet? Wie:
typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>
oder irgendeine andere Art und Weise, die anderen Teile des Programms ermöglichen, auf andere Architektur erstellt werden.
Lösung
Was Sie wollen, ist <stdint.h>
, die Compiler, die an den C-Standard ( „C99“) wird implementieren entsprechen. Leider enthält diese nicht Microsoft. Glücklicherweise ein Open-Source-Projekt eine <stdint.h>
für Windows bietet, finden Sie unter msinttypes .
Dies ermöglicht es Ihnen int32_t
und uint32_t
zu verwenden, plus 8, 16 und 64, und viele andere.
Hinweis: die Header-Datei selbst ist nicht im Standard optional, jedoch sind die meisten der Arten in der Kopfzeile einzeln optional. Einige sind nicht. Die am häufigsten verwendeten Typen sind die optionalen, aber nichts hindert Sie daran, die erforderlichen diejenigen verwenden. Die Sache ist, wenn eine Implementierung überhaupt den Header bietet, sie in der Praxis alle Typen definieren.
Andere Tipps
C99, in stdint.h definiert Typen wie int8_t
und int16_t
.
Nein, der C-Standard Mindestgrößen für integrale Typen gibt aber mach keine Garantie auf maximale Größe.
Eine Implementierung wird intN_t
Typen, wenn Arten von dieser Größe sind verfügbar bereitzustellen. Ich erwähne nur, dass da Sie einen plattformübergreifende Tag hatten -. Eine Implementierung, die braucht keinen Typen der richtigen Bit-Breite hat nicht diese Art zu schaffen
Sie können in der Regel wählen (mit Einstellung mit definiert zum Beispiel cc -D_INT16_IS_INT
und #ifdef
s) den richtigen Typ für eine bestimmte Bit-Größe zu verwenden. Sie können für jede Plattform die erforderlichen definiert trainieren Sie mit C-Code CHAR_BIT
und sizeof()
unterstützen möchten verwenden.
Der entsprechende Abschnitt des C1x Entwurfs (n1362) ist:
7.18.1.1 Exact-Breite Integer-Typ
-
Der Name typedef
intN_t
bezeichnet einen vorzeichenbehaftete Ganzzahl-Typen mit einer BreiteN
, keine Füllbits und ein Zweierkomplement-Darstellung. Somit bezeichnetint8_t
einen vorzeichenbehaftete Ganzzahl-Typen mit einer Breite von genau 8 Bits. -
Der typedef Name
uintN_t
bezeichnet einen unsigned Integer-Typ mit einer BreiteN
. Somit bezeichnet einenuint24_t
unsigned integer-Typen mit einer Breite von genau 24 Bit. -
Diese Typen sind optional. Wenn jedoch eine Implementierung Integer-Typen mit einer Breite von 8 bereitstellt, 16, 32, oder 64 Bits, keine Füllbits und (für den signierten Typen), die ein Zweierkomplement-Darstellung, so setzt er definiert die typedef Namen entspricht.
Im Hinblick auf die Auswahl von Typen, so etwas wie dies sollte genügen:
#ifdef INT32_IS_SHORT
typedef short INT32
#endif
#ifdef INT32_IS_INT
typedef int INT32
#endif
#ifdef INT32_IS_LONG
typedef long INT32
#endif
Wenn Sie nicht für jede Plattform mit #ifdef
überprüfen oder so, ich bezweifle es ist leicht möglich. Aber viele Bibliotheken tun bereits diese Aufgabe für Sie. Für MSVC ist es __int8
, __int16
, & c. Die GTK-Bibliothek ähnlich typedefs.
Sie können einen Blick auf pstdint.h nehmen wollen. Es ist eine portable Implementierung von stdint.h und nicht C99 Compiler-Unterstützung erforderlich ist.
Soweit ich weiß, die Antwort ist nein. Wir codieren für verschiedene Plattformen und wir verwenden typedefs nur für die spezifischen Plattformen # verwenden, wenn / # else. Zum Beispiel auf Win32: typedef int int32;
Sie können immer eine arithmetische Bibliothek schreiben, die Vektoren von unsigned char für die Zahlen verwendet. Auf diese Weise können Zahlen von was auch immer Bitlänge verwenden könnten Sie wollen, und erlauben auch die Bit-Länge zu variieren.
Eigentlich brauchen Sie nicht zu einer solchen Bibliothek zu implementieren, da GNU MP dies bereits behandelt.