Unterschied zwischen int32, int, int32_t, int8 und int8_t
Lesezeit: 4 Minuten
Linuxfreak
Ich bin auf den Datentyp gestoßen int32_t in einem C-Programm vor kurzem. Ich weiß, dass es 32 Bit speichert, aber nicht int und int32 das Gleiche tun?
Außerdem möchte ich verwenden char in einem Programm. Kann ich benutzen int8_t stattdessen? Was ist der Unterschied?
Zusammenfassen: Was ist der Unterschied zwischen int32, int, int32_t, int8 und int8_t in C?
Jerry Sarg
Zwischen int32 und int32_t(und ebenso zwischen int8 und int8_t) Der Unterschied ist ziemlich einfach: Der C-Standard definiert int8_t und int32_tdefiniert aber nichts Benanntes int8 oder int32 — Letzteres (falls es sie überhaupt gibt) stammt wahrscheinlich von einem anderen Header oder einer anderen Bibliothek (höchstwahrscheinlich älter als das Hinzufügen von int8_t und int32_t in C99).
Schmucklos int ist ein bisschen anders als die anderen. Wo int8_t und int32_t haben jeweils eine bestimmte Größe, int kann jede Größe >= 16 Bit haben. Zu verschiedenen Zeiten waren sowohl 16 Bit als auch 32 Bit einigermaßen üblich (und für eine 64-Bit-Implementierung sollten es wahrscheinlich 64 Bit sein).
Auf der anderen Seite, int ist garantiert in jeder Implementierung von C vorhanden, wobei int8_t und int32_t sind nicht. Ob dir das aber wichtig ist, ist wohl fraglich. Wenn Sie C auf kleinen eingebetteten Systemen und/oder älteren Compilern verwenden, kann dies ein Problem darstellen. Wenn Sie es hauptsächlich mit einem modernen Compiler auf Desktop-/Server-Rechnern verwenden, ist dies wahrscheinlich nicht der Fall.
Ups — den Teil über verpasst char. Sie würden verwenden int8_t anstelle von char if (und only if) Sie einen Integer-Typ haben möchten, der garantiert genau 8 Bit groß ist. Wenn Sie Zeichen speichern möchten, möchten Sie wahrscheinlich verwenden char stattdessen. 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 es sich um eine Ebene handelt char ist signiert oder unsigniert (und viele Compiler können es entweder eins machen, abhängig von einem Kompilierzeit-Flag). Wenn Sie sicherstellen müssen, dass es signiert oder nicht signiert ist, müssen Sie dies explizit angeben.
@linuxfreak: Nicht sicher bool_t – noch nie davon gehört. Der C-Standard definiert _Bool als Einbautyp. bool ist nur definiert, wenn Sie #include <stdbool.h> (als Makro, das erweitert wird zu _Bool).
– Jerry Sarg
25. Januar 2013 um 5:41 Uhr
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 Varianten von UNIX. Eine Ausnahme ist Cray / UNICOS, aber sie sind heutzutage aus der Mode gekommen.
– Sam Watkins
18. November 2014 um 5:53 Uhr
@SamWatkins: Ja, deshalb habe ich vorsichtig gesagt “sollte sein”, nicht “ist”. Der Standard besagt, dass es “die von der Architektur vorgeschlagene natürliche Größe” ist, was (IMO) auf einem 64-Bit-Prozessor wirklich bedeutet sollte 64 Bit sein (obwohl Sie wohl oder übel Recht haben, dass dies normalerweise nicht der Fall ist). Aus praktischer Sicht ist es ist Es ist schrecklich praktisch, einen 32-Bit-Typ unter den Typen in C89 zu haben, und wenn int 64 Bit ist, muss long auch mindestens 64 Bit sein, daher gibt es oft keinen 32-Bit-Typ.
– Jerry Sarg
18. November 2014 um 6:43 Uhr
@Barlop: Ja. (Sowohl C als auch C++ schreiben einen Mindestbereich von 255 Werten für char vor, also erfordert es mindestens 8 Bit, kann aber mehr sein).
– Jerry Sarg
19. Oktober 2015 um 21:33 Uhr
Ich hatte immer den Eindruck, dass ein Byte genau 8 Bits hat, nicht irgendwo ab 8 Bits
– ErlVolton
21. Oktober 2017 um 1:41 Uhr
Die _t-Datentypen sind typedef-Typen im stdint.h-Header, während int ein eingebauter grundlegender Datentyp ist. Dadurch wird _t nur verfügbar, wenn stdint.h vorhanden ist. int hingegen ist garantiert vorhanden.
Warum sollte man die _t verwenden?
– Deven
6. November 2016 um 0:11 Uhr
@Deven Um den Fall zu vermeiden, dass Ihr Code irgendwo funktioniert, aber nicht woanders.
– Franklin Yu
1. Februar 2017 um 5:20 Uhr
Naumann
Denken Sie immer daran, dass ‘size’ variabel ist, wenn es nicht explizit angegeben wird, also wenn Sie es deklarieren
int i = 10;
Auf einigen Systemen kann es vom Compiler zu 16-Bit-Ganzzahlen führen und auf einigen anderen zu 32-Bit-Ganzzahlen (oder 64-Bit-Ganzzahlen auf neueren Systemen).
In eingebetteten Umgebungen kann dies zu seltsamen Ergebnissen führen (insbesondere bei der Verarbeitung von speicherabgebildeten E/A oder kann als einfache Array-Situation betrachtet werden), daher wird dringend empfohlen, Variablen mit fester Größe anzugeben. In Legacy-Systemen können Sie darauf stoßen
typedef short INT16;
typedef int INT32;
typedef long INT64;
Beginnend mit C99 fügten die Designer die Header-Datei stdint.h hinzu, die im Wesentlichen ähnliche Typedefs nutzt.
Auf einem Windows-basierten System sehen Sie möglicherweise Einträge in der Header-Datei stdin.h als
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 Integer-Typen mit minimaler Breite oder Integer-Typen mit exakter Breite. Ich denke, es ist keine schlechte Sache, stdint.h zum besseren Verständnis zu untersuchen.
Dein Code hat einen Tippfehler: typedef short INT16;nicht typedefs short INT16.
– Galaxie
25. Dezember 2017 um 23:44 Uhr
14237000cookie-checkUnterschied zwischen int32, int, int32_t, int8 und int8_tyes