it-swarm.com.de

Wie deklariere ich eine 32-Bit-Ganzzahl in C?

Was ist der beste Weg, einen Ganzzahl-Typ zu deklarieren, der auf allen Plattformen immer 4 Byte ist? Ich mache mir keine Sorgen über bestimmte Geräte oder alte Maschinen, die 16-Bit int haben.

60
ZZ Coder
#include <stdint.h>

int32_t my_32bit_int;
98
Corey D

C befasst sich nicht sehr mit exakten Größen von Ganzzahltypen, C99 führt den Header stdint.h ein, der wahrscheinlich die beste Wahl ist. Fügen Sie das hinzu und Sie können z. int32_t. Natürlich unterstützen nicht alle Plattformen das.

12
nos

Coreys Antwort ist meiner Meinung nach richtig für "am besten", 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.)

Ein Vorteil von int32_t ist jedoch, dass Sie dieses Problem nicht aufrechterhalten!

11
Brooks Moses

Sie könnten eine Kopie von Brian Gladmans brg_types.h suchen, wenn Sie stdint.h nicht haben.

brg_types.h ermittelt die Größen der verschiedenen Ganzzahlen auf Ihrer Plattform und erstellt Typedefs für die gängigen Größen: 8, 16, 32 und 64 Bit.

5
cfrantz

Sie müssen inttypes.h anstelle von stdint.h einschließen, da stdint.h auf einigen Plattformen wie Solaris nicht verfügbar ist, und inttypes.h wird stdint.h für Sie auf Systemen wie z als Linux. Wenn Sie inttypes.h einschließen, ist Ihr Code zwischen Linux und Solaris portabler.

Dieser Link erklärt, was ich sage: HP Link über inttypes.h

Und dieser Link enthält eine Tabelle, aus der hervorgeht, warum Sie long oder int nicht verwenden möchten, wenn eine bestimmte Anzahl von Bits in Ihrem Datentyp vorhanden sein soll. IBM Link zu portablen Datentypen

5
Cutlasj

Wenn stdint.h für Ihr System nicht verfügbar ist, erstellen Sie Ihre eigene. Ich habe immer eine Datei namens "types.h", die Typedefs für alle 8, 16 und 32 Bit-Werte mit und ohne Vorzeichen hat.

0
Robert

abhängig von Ihren Zielplattformen können Sie Autotools für Ihr Build-System verwenden

es wird sehen, ob stdint.h/inttypes.h existiert und ob sie keine passenden Typedefs in einer "config.h" erstellen

0
Spudd86

stdint.h ist die naheliegende Wahl, die jedoch nicht unbedingt verfügbar ist.

Wenn Sie eine tragbare Bibliothek verwenden, kann es sein, dass sie bereits tragbare Ganzzahlen mit fester Breite zur Verfügung stellt . Zum Beispiel hat SDL Sint32 (S steht für "signiert") und GLib hat gint32.

0

C99 oder später

Verwenden Sie <stdint.h>.

Wenn Ihre Implementierung die 32-Bit-Ganzzahl von 2 unterstützt, muss int32_t definiert werden.

Wenn nicht, dann ist int_least32_t der nächstbeste Typ, der ein Integer-Typ ist, der von der Implementierung unterstützt wird und mindestens 32 Bit umfasst, unabhängig von der Darstellung (Zweierkomplement, Einsenkomplement usw.).

Es gibt auch int_fast32_t, einen ganzzahligen Typ mit mindestens 32 Bit Breite, der mit der Absicht ausgewählt wird, die schnellsten Operationen für diese Größenanforderung zuzulassen.

ANSI C

Sie können long verwenden, das aufgrund der vom Standard festgelegten Mindestbereichsanforderungen mindestens 32 Bit breit ist.

Wenn Sie lieber den kleinsten ganzzahligen Typ für eine 32-Bit-Zahl verwenden möchten, können Sie Präprozessoranweisungen wie folgt mit den in <limits.h> definierten Makros verwenden:

#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
0
Veltas