Frage

Ich bin mir bewusst, dass die Spezifikation der Sprache C nicht die genaue Größe jeden Integer-Typs diktieren wird (zum Beispiel int).

Was ich frage mich, ist: Gibt es eine Möglichkeit in C (nicht C ++) einen Integer-Typ mit einer bestimmten Größe zu definieren, es wird die gleiche über verschiedene Architekturen gewährleistet? Wie:

typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>

oder irgendeine andere Art und Weise, die anderen Teile des Programms ermöglichen, auf andere Architektur erstellt werden.

War es hilfreich?

Lösung

Was Sie wollen, ist <stdint.h>, die Compiler, die an den C-Standard ( „C99“) wird implementieren entsprechen. Leider enthält diese nicht Microsoft. Glücklicherweise ein Open-Source-Projekt eine <stdint.h> für Windows bietet, finden Sie unter msinttypes .

Dies ermöglicht es Ihnen int32_t und uint32_t zu verwenden, plus 8, 16 und 64, und viele andere.

Hinweis: die Header-Datei selbst ist nicht im Standard optional, jedoch sind die meisten der Arten in der Kopfzeile einzeln optional. Einige sind nicht. Die am häufigsten verwendeten Typen sind die optionalen, aber nichts hindert Sie daran, die erforderlichen diejenigen verwenden. Die Sache ist, wenn eine Implementierung überhaupt den Header bietet, sie in der Praxis alle Typen definieren.

Andere Tipps

C99, in stdint.h definiert Typen wie int8_t und int16_t.

Nein, der C-Standard Mindestgrößen für integrale Typen gibt aber mach keine Garantie auf maximale Größe.

Eine Implementierung wird intN_t Typen, wenn Arten von dieser Größe sind verfügbar bereitzustellen. Ich erwähne nur, dass da Sie einen plattformübergreifende Tag hatten -. Eine Implementierung, die braucht keinen Typen der richtigen Bit-Breite hat nicht diese Art zu schaffen

Sie können in der Regel wählen (mit Einstellung mit definiert zum Beispiel cc -D_INT16_IS_INT und #ifdefs) den richtigen Typ für eine bestimmte Bit-Größe zu verwenden. Sie können für jede Plattform die erforderlichen definiert trainieren Sie mit C-Code CHAR_BIT und sizeof() unterstützen möchten verwenden.

Der entsprechende Abschnitt des C1x Entwurfs (n1362) ist:


7.18.1.1 Exact-Breite Integer-Typ

  1. Der Name typedef intN_t bezeichnet einen vorzeichenbehaftete Ganzzahl-Typen mit einer Breite N, keine Füllbits und ein Zweierkomplement-Darstellung. Somit bezeichnet int8_t einen vorzeichenbehaftete Ganzzahl-Typen mit einer Breite von genau 8 Bits.

  2. Der typedef Name uintN_t bezeichnet einen unsigned Integer-Typ mit einer Breite N. Somit bezeichnet einen uint24_t unsigned integer-Typen mit einer Breite von genau 24 Bit.

  3. Diese Typen sind optional. Wenn jedoch eine Implementierung Integer-Typen mit einer Breite von 8 bereitstellt, 16, 32, oder 64 Bits, keine Füllbits und (für den signierten Typen), die ein Zweierkomplement-Darstellung, so setzt er definiert die typedef Namen entspricht.


Im Hinblick auf die Auswahl von Typen, so etwas wie dies sollte genügen:

#ifdef INT32_IS_SHORT
    typedef short INT32
#endif
#ifdef INT32_IS_INT
    typedef int INT32
#endif
#ifdef INT32_IS_LONG
    typedef long INT32
#endif

Wenn Sie nicht für jede Plattform mit #ifdef überprüfen oder so, ich bezweifle es ist leicht möglich. Aber viele Bibliotheken tun bereits diese Aufgabe für Sie. Für MSVC ist es __int8, __int16, & c. Die GTK-Bibliothek ähnlich typedefs.

Sie können einen Blick auf pstdint.h nehmen wollen. Es ist eine portable Implementierung von stdint.h und nicht C99 Compiler-Unterstützung erforderlich ist.

Soweit ich weiß, die Antwort ist nein. Wir codieren für verschiedene Plattformen und wir verwenden typedefs nur für die spezifischen Plattformen # verwenden, wenn / # else. Zum Beispiel auf Win32: typedef int int32;

Sie können immer eine arithmetische Bibliothek schreiben, die Vektoren von unsigned char für die Zahlen verwendet. Auf diese Weise können Zahlen von was auch immer Bitlänge verwenden könnten Sie wollen, und erlauben auch die Bit-Länge zu variieren.

Eigentlich brauchen Sie nicht zu einer solchen Bibliothek zu implementieren, da GNU MP dies bereits behandelt.

http://gmplib.org/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top