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

Lesezeit: 3 Minuten

Benutzeravatar von philix
philix

Ich sehe oft Quellcode, der Typen wie uint32, uint64 verwendet, 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?

mu ist der Benutzeravatar von too short
Mu ist zu kurz

Der C99 stdint.h definiert 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 verschiedene andere Integer-Typedefs in stdint.h auch.

Wenn Sie ohne eine C99-Umgebung festsitzen, sollten Sie wahrscheinlich Ihre eigenen Typedefs bereitstellen und trotzdem die C99-Typen verwenden.

Das uint32 und uint64 (dh ohne die _t Suffix) sind wahrscheinlich anwendungsspezifisch.

  • Diese Antwort ist falsch. Alle oben genannten sind nur verfügbar, wenn ein exakter Breitentyp dieser Größe (keine Polsterung) in der Implementierung vorhanden ist. Auch wenn nicht, jedoch die Typen int_leastNN_t und uint_leastNN_t zum NN 8, 16, 32 und 64 muss immer vorhanden sein. C99 erlaubt keine Implementierungen ohne einen Integer-Typ von mindestens 64 Bit, da long long muss mindestens so groß sein.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    16. Mai 2011 um 13:40 Uhr

  • @R ..: Wäre es richtig, “POSIX stdint.h” statt “C99 stdint.h” zu sagen?

    – mu ist zu kurz

    16. Mai 2011 um 16:40 Uhr

  • Posix stdint.h erfordert sie alle.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    16. Mai 2011 um 17:12 Uhr

  • @R .., Können Sie diese Antwort bitte auf Richtigkeit bearbeiten? Ich habe ein bisschen gebraucht, um die Kombination aus aktuellem Inhalt und Ihren Kommentaren zu analysieren.

    – merlin2011

    19. Februar 2017 um 7:24 Uhr


  • SDL definiert einen solchen Alias typedef uint32_t Uint32; in include/SDL_stdinc.h (wenn Sie SDL-Benutzer sind)

    – Et7f3XIV

    26. November 2019 um 9:58 Uhr

Diese Integer-Typen sind alle in definiert stdint.h

  • Ist nicht stdint.h implementierungsspezifisch? Siehe auch diese Frage und diese Frage

    – Chris Friedrich

    16. Mai 2011 um 4:49 Uhr


  • Beim Betrachten der Datei habe ich in den Kommentaren “ISO C99: 7.18 Integer-Typen ” gefunden. Ich nehme an, Sie bekommen stdint.h wenn Sie den C99-Standard respektieren.

    – philix

    16. Mai 2011 um 4:53 Uhr

  • Ich finde keinen von ihnen darin 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

    30. Juli 2016 um 20:57 Uhr

  • @jww: In meinem Fall enthält diese Datei #include "stdint-gcc.h"und gruppieren das Datei liefert die Definitionen.

    – Victor Zamanian

    16. August 2016 um 16:57 Uhr

  • @jww ja, sie existieren nicht. Die einzigen, die Standard sind und dort definiert werden sollten, sind die mit dem _t Suffix, wie in der obigen Antwort aufgeführt.

    – Victor Zamanian

    16. August 2016 um 23:43 Uhr

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

  • Bitte zitieren Sie etwas in diesem Zusammenhang.

    – BiGYan

    16. Mai 2011 um 16:41 Uhr

  • x86 unterstützt keine 64-Bit-Mathematik, hat aber 64-Bit-Typen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    16. Mai 2011 um 17:16 Uhr

  • Ja tut es. Es unterstützt 32-Bit x 32-Bit -> 64-Bit-Multiplikation, 64-Bit / 32-Bit -> 32-Bit-Quotienten- und 32-Bit-Restdivision sowie Addieren mit Übertrag und Subtrahieren mit Borrow-Anweisungen. Es wurde gebaut, um 64-Bit-Arithmetik ausführen zu können, und sei es nur, weil der 8086 in der Lage sein musste, 32-Bit-Arithmetik auszuführen.

    – Michael Morris

    8. April 2014 um 2:47 Uhr


  • Da ist auch ein uint128_t wenn __SIZEOF_INT128__ auf 16 oder höher definiert ist (GCC und kompatible). Es ist auf x86_64/amd64-Rechnern verfügbar, aber der Prozessor unterstützt es nicht nativ. Nur Crays haben diese Registergröße, IIRC.

    – jww

    16. August 2016 um 22:14 Uhr

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

Es gibt keine Standard-Header – auch keine im /usr/include/-Ordner von Linux, die sie ohne das “_t” definieren.

1421570cookie-checkSind Typen wie uint32, int32, uint64, int64 in einem stdlib-Header definiert?

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

Privacy policy