So deklarieren Sie eine 32-Bit-Ganzzahl in C

Lesezeit: 5 Minuten

Benutzeravatar von ZZ Coder
ZZ-Codierer

Was ist der beste Weg, um einen Integer-Typ zu deklarieren, der auf allen Plattformen immer 4 Byte ist? Ich mache mir keine Sorgen um bestimmte Geräte oder alte Maschinen mit 16-Bit int.

  • In C muss ein Byte nicht 8 Bit sein, also könnten 32 Bit und 4 Byte verschiedene Dinge bedeuten.

    – KTC

    4. August 2009 um 18:37 Uhr

  • @KTC: Gibt es Plattformen, die Byte anders definieren?

    – Mr. Shiny und New 安宇

    4. August 2009 um 18:57 Uhr

  • Ich bin auch neugierig zu wissen, wo char!=8bits und ein byte!=8bits. char!=8bits scheint ok zu sein, da ich char==4bits in meinem eigenen undesignten System oder einem alten System haben kann, aber wo kommt byte!=8bits ??

    – seg.server.fehler

    4. August 2009 um 19:00 Uhr

  • Nicht wenige DSPs und dergleichen haben 16-Bit-Zeichen (und C hat kein anderes Konzept eines “Bytes” als Zeichen – es ist tatsächlich die kleinste adressierbare Speichereinheit).

    – Steve Jessop

    4. August 2009 um 22:54 Uhr

  • Eine der Honeyboxen, die wir noch haben, hat 6-Bit- und 9-Bit-Bytes, je nachdem, in welchem ​​​​Adressierungsmodus Sie sich befinden.

    – Benutzer7116

    21. Oktober 2009 um 17:25 Uhr

#include <stdint.h>

int32_t my_32bit_int;

  • Nur zu beachten, dass intN_t (und uintN_t) standardmäßig optional sind. Sie muss genau dann definiert werden, wenn das System über Typen verfügt, die die Anforderung erfüllen.

    – KTC

    4. August 2009 um 18:39 Uhr

  • Das willst du doch. Wenn der Code wirklich ein 32-Bit-int erfordert und Sie versuchen, ihn auf einer Plattform zu kompilieren, die sie nicht unterstützt, müssen Sie wollen der Compiler an den Entwickler zurückzugeben. Es wäre schrecklich, wenn es eine andere Größe auswählen und weitermachen würde.

    – TED

    4. August 2009 um 19:20 Uhr

  • Beachten Sie, dass die Kopfzeile ‘<inttypes.h>‘ explizit dokumentiert ist, um den Header ‘<stdint.h>‘ (das ist bei C-Headern nicht üblich), aber das ‘<inttypes.h>‘ Kopfzeile kann verfügbar sein, wo ‘<stdint.h>‘ ist keine bessere Wahl für die Portabilität und könnte dies sein. Das ‘<stdint.h>‘ Header ist eine Erfindung des Standards Committee und wurde erstellt, damit freistehende Implementierungen von C (im Gegensatz zu gehosteten Implementierungen – normale) nur ‘ unterstützen müssen.<stdint.h>‘ und nicht unbedingt ‘<inttypes.h>‘ auch (es würde auch bedeuten, zu unterstützen ‘<stdio.h>‘, was sonst nicht nötig ist).

    – Jonathan Leffler

    4. August 2009 um 19:28 Uhr

  • Gibt es eine Möglichkeit, int32_t als unsigned zu definieren?

    – Matthäus Herbst

    21. April 2014 um 21:22 Uhr

  • @MatthewHerbst, uint32_t.

    – Benutzer545424

    6. Mai 2014 um 17:02 Uhr

Benutzeravatar von nos
Nr

C kümmert sich nicht sehr um genaue Größen von Integer-Typen, C99 führt den Header ein stdint.h , was wahrscheinlich Ihre beste Wahl ist. Fügen Sie das hinzu und Sie können zB verwenden int32_t. Das wird natürlich nicht von allen Plattformen unterstützt.

Coreys Antwort ist meiner Meinung nach richtig für “am besten”, aber ein einfaches “int” funktioniert auch in der Praxis (vorausgesetzt, Sie ignorieren Systeme mit 16-Bit-Int). An diesem Punkt hängt so viel Code davon ab, dass int 32-Bit ist, dass Systemanbieter ihn nicht ändern werden.

(Siehe auch, warum lang auf vielen 64-Bit-Systemen 32-Bit ist und warum wir “lang lang” haben.)

Einer der Vorteile der Verwendung von int32_t ist jedoch, dass Sie dieses Problem nicht aufrechterhalten!

  • Es besteht keine Notwendigkeit „Systeme mit 16-bit int zu ignorieren“, long ist garantiert überall mindestens 32-bit breit.

    – Bastien Léonard

    4. August 2009 um 20:30 Uhr

  • Richtig, aber die Verwendung von “long” adressiert nicht die ursprüngliche Anfrage, die genau 32 Bit lang ist. Auf (zumindest einigen Varianten von) 64-Bit-Linux zum Beispiel ist a long 64 Bit – und das ist etwas, das in der Praxis wahrscheinlich vorkommen wird.

    – Brooks Moses

    4. August 2009 um 23:16 Uhr

Benutzeravatar von cfrantz
cfranz

Sie könnten nach einer Kopie von Brian Gladman suchen brg_types.h wenn du nicht hast stdint.h.

brg_types.h ermittelt die Größen der verschiedenen Ganzzahlen auf Ihrer Plattform und erstellt Typedefs für die gängigen Größen: 8, 16, 32 und 64 Bit.

Benutzeravatar von Cutlasj
Cutlasj

Sie müssen einschließen inttypes.h Anstatt von stdint.h Weil stdint.h ist auf einigen Plattformen wie Solaris und nicht verfügbar inttypes.h wird beinhalten stdint.h für Sie auf Systemen wie Linux. Wenn Sie einschließen inttypes.h dann ist Ihr Code besser zwischen Linux und Solaris portierbar.

Dieser Link erklärt, was ich meine:
HP-Link zu inttypes.h

Und dieser Link hat eine Tabelle, die zeigt, warum Sie nicht verwenden möchten long oder int wenn Sie beabsichtigen, dass eine bestimmte Anzahl von Bits in Ihrem Datentyp vorhanden ist.
IBM-Link zu portablen Datentypen

Benutzeravatar von Veltas
Veltas

C99 oder höher

Verwenden <stdint.h>.

Wenn Ihre Implementierung Zweierkomplement-32-Bit-Ganzzahlen unterstützt, muss sie definiert werden int32_t.

Wenn nicht, dann ist das Nächstbeste int_least32_t Dabei handelt es sich um einen ganzzahligen Typ, der von der Implementierung unterstützt wird und unabhängig von der Darstellung (Zweierkomplement, Einerkomplement usw.) mindestens 32 Bit groß ist.

Es gibt auch int_fast32_t Dabei handelt es sich um einen Integer-Typ mit einer Breite von mindestens 32 Bit, der mit der Absicht ausgewählt wurde, die schnellsten Operationen für diese Größenanforderung zu ermöglichen.

ANSI-C

Sie können verwenden longdie aufgrund der vom Standard festgelegten Mindestbereichsanforderungen garantiert mindestens 32 Bit breit ist.

Wenn Sie lieber den kleinsten ganzzahligen Typ verwenden möchten, um eine 32-Bit-Zahl anzupassen, können Sie Präprozessoranweisungen wie die folgenden mit den in definierten Makros verwenden <limits.h>:

#define TARGET_MAX 2147483647L

#if   SCHAR_MAX >= TARGET_MAX
  typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
  typedef short int32;
#elif INT_MAX   >= TARGET_MAX
  typedef int int32;
#else
  typedef long int32;
#endif

#undef TARGET_MAX

Benutzeravatar von Robert Deml
Robert Deml

Wenn stdint.h für Ihr System nicht verfügbar ist, erstellen Sie Ihre eigene. Ich habe immer eine Datei namens “types.h”, die Typedefs für alle vorzeichenbehafteten/vorzeichenlosen 8-, 16- und 32-Bit-Werte enthält.

1419100cookie-checkSo deklarieren Sie eine 32-Bit-Ganzzahl in C

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

Privacy policy