Was ist der beste Weg, um einen Integer-Typ zu deklarieren, der auf allen Plattformen immer 4 Byte beträgt? Ich mache mir keine Sorgen um bestimmte Geräte oder alte Maschinen mit 16-Bit int
.
Was ist der beste Weg, um einen Integer-Typ zu deklarieren, der auf allen Plattformen immer 4 Byte beträgt? Ich mache mir keine Sorgen um bestimmte Geräte oder alte Maschinen mit 16-Bit int
.
Antworten:
#include <stdint.h>
int32_t my_32bit_int;
<inttypes.h>
explizit so dokumentiert ist, dass er den Header enthält <stdint.h>
(dies ist bei C-Headern nicht üblich). <inttypes.h>
Der Header ist jedoch möglicherweise verfügbar, wenn dies <stdint.h>
nicht der Fall ist, und ist möglicherweise eine bessere Wahl für die Portabilität. Der <stdint.h>
Header ist eine Erfindung des Normungsausschusses und wurde so erstellt, dass freistehende Implementierungen von C (im Gegensatz zu gehosteten Implementierungen - normale) nur <stdint.h>
"und nicht unbedingt auch" unterstützen müssen <inttypes.h>
(dies würde auch bedeuten) Unterstützung ' <stdio.h>
', was sonst nicht notwendig ist).
uint32_t
.
C kümmert sich nicht sehr um die exakten Größen von Ganzzahltypen. C99 führt den Header stdint.h ein , der wahrscheinlich die beste Wahl ist. Schließen Sie das ein und Sie können z int32_t
. Natürlich unterstützen dies möglicherweise nicht alle Plattformen.
Coreys Antwort ist meiner Meinung nach richtig für "best", aber ein einfaches "int" funktioniert auch in der Praxis (vorausgesetzt, Sie ignorieren Systeme mit 16-Bit-int). Zu diesem Zeitpunkt hängt so viel Code davon ab, dass int 32-Bit ist, dass Systemanbieter ihn nicht ändern werden.
(Siehe auch, warum long auf vielen 64-Bit-Systemen 32-Bit ist und warum wir "long long" haben.)
Einer der Vorteile der Verwendung von int32_t ist jedoch, dass Sie dieses Problem nicht aufrechterhalten!
Sie könnten eine Kopie von Brian Gladman suchen, brg_types.h
wenn Sie keine haben stdint.h
.
brg_types.h
Ermittelt die Größe der verschiedenen Ganzzahlen auf Ihrer Plattform und erstellt Typedefs für die gängigen Größen: 8, 16, 32 und 64 Bit.
Sie müssen einschließen, inttypes.h
anstatt, stdint.h
weil stdint.h
es auf einigen Plattformen wie Solaris nicht verfügbar ist und auf Systemen wie Linux für Sie inttypes.h
einschließt stdint.h
. Wenn Sie einschließen, inttypes.h
ist Ihr Code zwischen Linux und Solaris portabler.
Dieser Link erklärt, was ich sage: HP Link zu inttypes.h
Und dieser Link enthält eine Tabelle, die zeigt, warum Sie nicht verwenden möchten long
oder int
ob Sie beabsichtigen, dass eine bestimmte Anzahl von Bits in Ihrem Datentyp vorhanden ist.
IBM Link zu tragbaren Datentypen
stdint.h ist die offensichtliche Wahl, aber nicht unbedingt verfügbar.
Wenn Sie eine tragbare Bibliothek verwenden, sind möglicherweise bereits tragbare Ganzzahlen mit fester Breite verfügbar. Zum Beispiel hat SDL Sint32
(S steht für "signiert") und GLib hat gint32
.
Verwenden Sie <stdint.h>
.
Wenn Ihre Implementierung 2-Komplement-32-Bit-Ganzzahlen unterstützt, muss sie definiert werden int32_t
.
Wenn nicht, ist das nächstbeste int_least32_t
ein ganzzahliger Typ, der von der Implementierung unterstützt wird und unabhängig von der Darstellung (Zweierkomplement, Einerkomplement usw.) mindestens 32 Bit beträgt.
Es gibt auch int_fast32_t
einen Integer-Typ mit einer Breite von mindestens 32 Bit, der mit der Absicht ausgewählt wurde, die schnellsten Operationen für diese Größenanforderung zu ermöglichen.
Sie können verwenden long
, die aufgrund der im Standard festgelegten Mindestbereichsanforderungen garantiert eine Breite von mindestens 32 Bit hat.
Wenn Sie lieber den kleinsten Ganzzahltyp verwenden möchten, um eine 32-Bit-Zahl anzupassen, können Sie Präprozessoranweisungen wie die folgenden mit den in definierten Makros verwenden <limits.h>
:
#define TARGET_MAX 2147483647L
#if SCHAR_MAX >= TARGET_MAX
typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
typedef short int32;
#elif INT_MAX >= TARGET_MAX
typedef int int32;
#else
typedef long int32;
#endif
#undef TARGET_MAX