Sind Typen wie uint32, int32, uint64, int64 in einem stdlib-Header definiert?

94

Ich sehe oft Quellcode mit Typen wie uint32, uint64 und ich frage mich, ob sie vom Programmierer im Anwendungscode definiert werden sollten oder ob sie in einem Standard-lib-Header definiert sind.

Was ist der beste Weg, um diese Typen in meinem Anwendungsquellcode zu haben?

Philix
quelle

Antworten:

135

Der C99 stdint.hdefiniert diese:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

Und wenn die Architektur sie unterstützt:

  • int64_t
  • uint64_t

Es gibt auch verschiedene andere ganzzahlige Typedefs stdint.h.

Wenn Sie ohne C99-Umgebung nicht weiterkommen, sollten Sie wahrscheinlich Ihre eigenen Typedefs angeben und die C99 trotzdem verwenden.

Die uint32und uint64(dh ohne das _tSuffix) sind wahrscheinlich anwendungsspezifisch.

mu ist zu kurz
quelle
16
Diese Antwort ist falsch. Alle oben genannten sind nur verfügbar, wenn in der Implementierung ein exakter Breitentyp dieser Größe (kein Auffüllen) vorhanden ist. Auch wenn nicht, müssen die Typen int_leastNN_tund uint_leastNN_tfür NN8, 16, 32 und 64 immer existieren . C99 erlaubt keine Implementierungen ohne einen Integer-Typ von mindestens 64 Bit, da long longmindestens so groß sein muss.
R .. GitHub STOP HELPING ICE
@R ..: Wäre es richtig, "POSIX stdint.h" statt "C99 stdint.h" zu sagen?
Mu ist zu kurz
1
POSIX stdint.hbenötigt sie alle.
R .. GitHub STOP HELPING ICE
1
@R .., Kannst du diese Antwort bitte auf Richtigkeit bearbeiten? Ich habe ein bisschen gebraucht, um die Kombination aus aktuellem Inhalt und Ihren Kommentaren zu analysieren.
Merlin2011
SDL definieren Alias ​​solche Alias typedef uint32_t Uint32;in include / SDL_stdinc.h (wenn Sie SDL-Benutzer sind)
Et7f3XIV
10

Diese ganzzahligen Typen sind alle in definiert stdint.h

GWW
quelle
Ist nicht stdint.himplementierungsspezifisch? Siehe auch diese Frage und diese Frage
Chris Frederick
3
Als ich mir die Datei ansah, fand ich in den Kommentaren "ISO C99: 7.18 Integer-Typen <stdint.h>". Ich nehme an, Sie bekommen, stdint.hwenn Sie den C99-Standard respektieren.
Philix
Ich finde keinen von ihnen in stdint.h. Dies gibt 0 Treffer zurück : grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
JWW
1
@jww: In meinem Fall enthält diese Datei #include "stdint-gcc.h", und wenn Sie diese Datei erfassen , erhalten Sie die Definitionen.
Victor Zamanian
1
@jww ja, sie existieren nicht. Die einzigen, die Standard sind und die dort definiert werden sollten, sind diejenigen mit dem _tSuffix, wie in der obigen Antwort aufgeführt.
Victor Zamanian
2

Wenn Sie C99 verwenden, schließen Sie einfach ein stdint.h. Übrigens gibt es die 64-Bit-Typen, wenn der Prozessor sie unterstützt.

BiGYaN
quelle
Bitte zitieren Sie diesbezüglich etwas.
BiGYaN
6
x86 unterstützt keine 64-Bit-Mathematik, verfügt jedoch über 64-Bit-Typen.
R .. GitHub STOP HELPING ICE
2
Ja tut es. Es unterstützt 32-Bit x 32-Bit -> 64-Bit-Multiplikation, 64-Bit / 32-Bit -> 32-Bit-Quotient und 32-Bit-Restdivision sowie Addieren mit Übertrag und Subtrahieren mit Ausleihanweisungen. Es wurde entwickelt, um 64-Bit-Arithmetik ausführen zu können, schon allein deshalb, weil der 8086 32-Bit-Arithmetik ausführen musste.
Michael Morris
Es gibt auch ein uint128_tif, __SIZEOF_INT128__das auf 16 oder höher definiert ist (GCC und kompatible Geräte). Es ist auf x86_64 / amd64-Computern verfügbar, wird jedoch vom Prozessor nicht nativ unterstützt. Nur Cray's haben diese Registergröße, IIRC.
JWW
0

Der Fragesteller fragte tatsächlich nach int16 (etc) und nicht nach (hässlich) int16_t (etc).

Es gibt keine Standard-Header - und auch keine im Linux-Ordner / usr / include /, die sie ohne das "_t" definieren.

Steve
quelle