16-Bit-Integer in C definieren

Lesezeit: 4 Minuten

Ich muss eine Ganzzahl in der Größe von 16 Bit in C deklarieren.

Ich weiß, dass kurze und int-Größen maschinenabhängig sind.

Ich habe versucht zu verwenden "stdint.h", aber es scheint, dass sie es einfach tun

typedef short int16_t

Also meine Frage ist:

Übersehe ich etwas und der kurze Typ garantiert eine Länge von 16 Bit?

Wenn nein, gibt es eine Alternative, die dies garantiert?

  • Vielleicht kenne ich C einfach nicht, aber ich denke int16_t ist wahrscheinlich garantiert 16 Bit.

    – Ry-

    21. März 2012 um 21:38 Uhr


  • Es gibt keine Garantie. Den Leuten, die den Header geschrieben haben, steht es frei, nicht portierbare Annahmen zu treffen, die möglicherweise nicht auf einen anderen Compiler zutreffen. Verwenden Sie die typedef statt short.

    – asveikau

    21. März 2012 um 21:43 Uhr

  • Ich glaube, es gibt eine eng verwandte Frage Exakte Breite Integer-Typen in C (stdint.h) Die Behauptung dort ist, wenn int16_t definiert ist, ist es richtig, unabhängig davon, wie. Also zum Beispiel auf einem 8-Bit-Mikrocontroller wie einem AVR (auf einem Arduino), stdint.h enthalten könnte typedef int int16_t; Aber es muss nicht definiert werden, wenn es nicht richtig gemacht werden kann. Es gibt Ein weiterer Satz verwandter Typen, die in diesem Moment entkommen. Wie auch immer, der Compiler wird einen Fehler ausgeben, wenn er nicht vorhanden ist, also sollte er testbar sein.

    – gbulmer

    21. März 2012 um 22:04 Uhr

Benutzer-Avatar
Maerik

Das bedeutet int16_t ist definiert als short an dein Maschine, nicht alle Maschinen.

Verwenden Sie einfach die int16_t wo Sie unbedingt einen 16-Bit-Ganzzahltyp benötigen; es wird auf allen Plattformen, die dies bereitstellen, als angemessen definiert stdint.h (das sollte alles sein, was C99 unterstützt, bzw cstdint für C++).

[Edit] Zur Verdeutlichung: „stdint.h“-Header-Datei wird vom C- (oder C++-) Compiler bereitgestellt, daher wird ihr Inhalt wahrscheinlich je nach Compiler, Version, System, CPU-Architektur usw. variieren. Das heißt, die Autoren der Compiler-Suite wissen genau, welche Typen welche Größen auf welchen haben Wenn Sie sich diese Datei auf nur einem System ansehen, erfahren Sie nur etwas über die Definitionen für eine bestimmte Version eines bestimmten Compilers auf einem bestimmten Betriebssystem auf einer bestimmten Architektur (z. B. GCC 4.2 auf Darwin x86_64 oder Visual Studio auf WinNT Alpha oder ICC auf Solaris IA32 usw.) Einige Systeme, insbesondere eingebettete, haben möglicherweise unterschiedliche Schriftgrößen, also a short möglicherweise nicht immer 16 Bit, und der Compiler würde die richtige Größe für diese Bitlänge kennen.

Wenn Sie sich die Datei ansehen stdint.h auf einem anderen System können die Definitionen unterschiedlich oder gleich sein – aber ihr Zweck ist es, die Definitionen für Integer-Typen mit garantierten Bitlängen bereitzustellen.

  • Ich meinte, dass sie in der Kopfzeile nur diese Zeilen verworfen haben, ohne jegliche Bedingungen, um sie zu überprüfen. Wie genau wird es also auf meinem Computer und nicht auf allen Computern als kurz definiert?

    – Sara

    23. März 2012 um 12:41 Uhr


Nein, short tut nicht 16-Bit-Länge garantieren. Die einzigen Garantien für die grundlegenden Integer-Datentypen sind:

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1 (kein Tee char könnten immer noch mehr als 8 Bit sein!)
  • SHRT_MIN <= -32767 und SHRT_MAX >= 32767 (impliziert short ist mindestens 16 Bit)
  • INT_MIN <= -32767 und INT_MAX >= 32767 (impliziert int ist mindestens 16 Bit)
  • LONG_MIN <= -2147483647 und LONG_MAX >= 2147483647 (impliziert long ist mindestens 32 Bit)
  • LLONG_MIN <= -9223372036854775807 und LLONG_MAX >= 9223372036854775807 (impliziert long long ist mindestens 64 Bit)

(C99 §5.2.4.2.1 und Anhang E)

Die Tatsache, dass short ist typdefiniert int16_t an dein Maschine bedeutet nur, dass a short ist 16 Bit an dein Maschine. Dies bedeutet nicht, dass die Definition auf den Computern anderer Leute (oder sogar auf anderen Kompilierungen auf demselben Computer) dieselbe ist.

Wenn Sie einschließen <stdint.h>wird es definieren int16_t In gewisser Weise ist dies garantiert ein Typ, der vorzeichenbehaftet und 16 Bit breit ist. Wenn Sie Integer mit exakter Größe benötigen, verwenden Sie diese Typen mit exakter Größe.

Diese Definitionen können für jede Maschine verfügbar sein oder auch nicht.

Das einzige real Der sichere Weg, dies zu tun, ist über eine Konfigurationsprüfung oder so etwas.

Aber wenn int16_t existiert (und configure es findet), dann sollte es ein Kurzschluss auf Maschinen sein, auf denen ein Kurzschluss tatsächlich 16 Bit ist. Wenn ein Kurzschluss eine andere Größe hat, würde dieses System int16_t für Sie auf etwas anderes definieren. IE, wenn int16_t verfügbar ist, können Sie davon ausgehen, dass es 2 Bytes lang ist.

short ist nur garantiert mindestens 16-bit breit.

Es kann sein 16-bit breit in Ihrem System, aber 32-bit in einem anderen System.

1309920cookie-check16-Bit-Integer in C definieren

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

Privacy policy