Unterschied zwischen int32, int, int32_t, int8 und int8_t

Lesezeit: 4 Minuten

Benutzeravatar von linuxfreak
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?

Benutzeravatar von Jerry Coffin
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

Benutzeravatar von Naumann
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


1423700cookie-checkUnterschied zwischen int32, int, int32_t, int8 und int8_t

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy