Unterschied zwischen int32, int, int32_t, int8 und int8_t

103

Ich bin int32_tkürzlich in einem C-Programm auf den Datentyp gestoßen. Ich weiß, dass es 32 Bit speichert, aber nicht intund int32das Gleiche tun?

Außerdem möchte ich charin einem Programm verwenden. Kann ich int8_tstattdessen verwenden? Was ist der Unterschied?

Zusammenfassend: Was ist der Unterschied zwischen int32, int, int32_t, int8 und int8_t in C?

Linuxfreak
quelle

Antworten:

122

Zwischen int32und int32_t, (und ebenso zwischen int8und int8_t) ist der Unterschied ziemlich einfach: Der C-Standard definiert int8_tund int32_t, definiert aber nichts mit dem Namen int8oder int32- letzteres (falls überhaupt vorhanden) stammt wahrscheinlich aus einem anderen Header oder einer anderen Bibliothek (höchstwahrscheinlich) vor der Hinzufügung von int8_tund int32_tin C99).

Plain intist ganz anders als die anderen. Wo int8_tund int32_tjeder eine bestimmte Größe hat, intkann eine beliebige Größe> = 16 Bit sein. Zu unterschiedlichen Zeiten waren sowohl 16 Bit als auch 32 Bit ziemlich häufig (und für eine 64-Bit-Implementierung sollten es wahrscheinlich 64 Bit sein).

Andererseits intist garantiert, dass es in jeder Implementierung von C vorhanden ist, wo int8_tund int32_tnicht. Es ist wahrscheinlich offen zu fragen, ob dies für Sie wichtig ist. Wenn Sie C auf kleinen eingebetteten Systemen und / oder älteren Compilern verwenden, kann dies ein Problem sein. Wenn Sie es hauptsächlich mit einem modernen Compiler auf Desktop- / Server-Computern verwenden, wird dies wahrscheinlich nicht der Fall sein.

Ups - habe den Teil verpasst char. Sie würden int8_tanstelle von char verwenden, wenn (und nur wenn) Sie möchten, dass ein ganzzahliger Typ garantiert genau 8 Bit groß ist. Wenn Sie Zeichen speichern möchten, möchten Sie wahrscheinlich charstattdessen verwenden. Seine Größe kann variieren (in Bezug auf die Anzahl der Bits), aber es ist garantiert genau ein Byte. Eine kleine Kuriosität: Es gibt keine Garantie dafür, ob eine Ebene charsigniert oder nicht signiert ist (und viele Compiler können sie je nach einem Flag zur Kompilierungszeit zu einer machen). Wenn Sie sicherstellen möchten, dass es entweder signiert oder nicht signiert ist, müssen Sie dies explizit angeben.

Jerry Sarg
quelle
1
@linuxfreak: Ich bin mir nicht sicher bool_t- noch nie davon gehört. Der C-Standard definiert _Boolals eingebauten Typ. boolwird nur definiert, wenn Sie #include <stdbool.h>(als Makro, das erweitert wird _Bool).
Jerry Coffin
5
Sie sagten "für eine 64-Bit-Implementierung sollte (int) wahrscheinlich 64 Bit sein". In der Praxis ist int 32-Bit auf allen gängigen 64-Bit-Plattformen, einschließlich Windows, Mac OS X, Linux und verschiedenen UNIX-Varianten. Eine Ausnahme ist Cray / UNICOS, aber sie sind heutzutage aus der Mode.
Sam Watkins
6
@ SamWatkins: Ja, deshalb habe ich sorgfältig gesagt "sollte sein", nicht "ist". Die Norm sagt , dass es „die natürliche Größe der Architektur vorgeschlagen“, die (IMO) Mittel auf einem 64-Bit - Prozessor, es ist wirklich sollte 64 Bits sein (obwohl, für besser oder schlechter, sind Sie ganz richtig , dass es in der Regel isn‘ t). Aus praktischer Sicht, es ist furchtbar praktisch , einen 32-Bit - Typen unter den Typen in C89 zu haben, und wenn int 64 Bit ist, hat lange zu mindestens 64 Bits sein, so dass es oft keinen 32-Bit sein würde Art.
Jerry Coffin
2
@barlop: Ja. (Sowohl C als auch C ++ schreiben einen Mindestbereich von 255 Werten für char vor, daher sind mindestens 8 Bit erforderlich, es können jedoch auch mehr sein.)
Jerry Coffin
2
Ich hatte immer den Eindruck, dass ein Byte genau 8 Bit war, nicht irgendwo ab 8 Bit
ErlVolton
18

Die Datentypen _t sind typedef-Typen im Header stdint.h, während int ein eingebauter grundlegender Datentyp ist. Dadurch wird das _t nur verfügbar, wenn stdint.h vorhanden ist. int hingegen ist garantiert vorhanden.

Übermensch
quelle
1
Warum sollte man die _t verwenden?
Deven
@Deven Um zu vermeiden, dass Ihr Code irgendwo funktioniert, aber nicht woanders.
Franklin Yu
2

Denken Sie immer daran, dass 'Größe' variabel ist, wenn dies nicht explizit angegeben wird

 int i = 10;

Auf einigen Systemen kann der Compiler zu einer 16-Bit-Ganzzahl führen, auf anderen zu einer 32-Bit-Ganzzahl (auf neueren Systemen zu einer 64-Bit-Ganzzahl).

In eingebetteten Umgebungen kann dies zu seltsamen Ergebnissen führen (insbesondere beim Umgang mit speicherabgebildeten E / A oder als einfache Array-Situation). Es wird daher dringend empfohlen, Variablen mit fester Größe anzugeben. In Legacy-Systemen können Sie auf etwas stoßen

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

Ab C99 fügten die Designer die Header-Datei stdint.h hinzu, die im Wesentlichen ähnliche typedefs nutzt.

Auf einem Windows-basierten System werden möglicherweise Einträge in der Header-Datei stdin.h als angezeigt

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

Es gibt noch viel mehr, wie die Ganzzahl mit minimaler Breite oder die Ganzzahl mit exakter Breite. Ich denke, es ist keine schlechte Sache, stdint.h zum besseren Verständnis zu untersuchen.

Naumann
quelle
1
Ihr Code hat einen Tippfehler : typedef short INT16;, nicht typedefs short INT16.
Galaxy