10 Stimmen

Größengarantie für ganzzahlige/arithmetische Typen in C und C++

Ich weiß, dass der C++-Standard ausdrücklich nur die Größe von char , signed char y unsigned char . Außerdem gibt es Garantien, dass z. B., short ist mindestens so groß wie char , int so groß wie short usw. Aber keine ausdrücklichen Garantien über den absoluten Wert von, sagen wir, sizeof(int) . Das war die Information in meinem Kopf, und ich habe mich damit abgefunden. Vor einiger Zeit stieß ich jedoch auf einen Kommentar in SO (kann ihn nicht mehr finden), dass in C long ist garantiert mindestens 4 Byte groß, und diese Anforderung wird von C++ "geerbt". Ist das der Fall? Wenn ja, welche anderen impliziten Garantien gibt es für die Größe von arithmetischen Typen in C++? Bitte beachten Sie, dass ich absolut nicht interessiert bin an praktisch Garantien über verschiedene Plattformen hinweg in dieser Frage, nur theoretisch ein.

13voto

Steve Jessop Punkte 264569

18.2.2 garantiert, dass <climits> hat den gleichen Inhalt wie der Header der C-Bibliothek <limits.h> .

Die ISO C90-Norm ist schwer zu bekommen, was schade ist, wenn man bedenkt, dass C++ darauf aufbaut, aber der Abschnitt "Numerische Grenzen" (nummeriert 2.2.4.2 in einem zufälligen Entwurf, den ich bei einer Gelegenheit aufgespürt habe und der noch herumliegt) gibt Mindestwerte für die INT_MAX usw. Konstanten in <limits.h> . Zum Beispiel ULONG_MAX mindestens 4294967295 betragen muss, woraus wir ableiten, dass die Breite von long mindestens 32 Bit beträgt.

Es gibt ähnliche Einschränkungen im C99-Standard, aber das sind natürlich nicht die, auf die C++03 verweist.

Dies bedeutet no garantieren, dass long mindestens 4 Bytes beträgt, da in C und C++ "Byte" grundsätzlich als "char" definiert ist und nicht garantiert ist, dass CHAR_BIT ist 8 in C oder C++. CHAR_BIT == 8 wird sowohl von POSIX als auch von Windows garantiert.

12voto

pmg Punkte 102904

Ich weiß nicht, wie es mit C++ aussieht. In C haben Sie

                                  Annex E
                              (informative)

                          Implementation limits

       \[#1\]  The contents of the header  are given below,
       in alphabetical order.  The minimum magnitudes  shown  shall
       be  replaced  by  implementation-defined magnitudes with the
       same sign.  The values shall  all  be  constant  expressions
       suitable  for  use  in  #if  preprocessing  directives.  The
       components are described further in 5.2.4.2.1.

               #define CHAR\_BIT                         8
               #define CHAR\_MAX    UCHAR\_MAX or SCHAR\_MAX
               #define CHAR\_MIN            0 or SCHAR\_MIN
               #define INT\_MAX                     +32767
               #define INT\_MIN                     -32767
               #define LONG\_MAX               +2147483647
               #define LONG\_MIN               -2147483647
               #define LLONG\_MAX     +9223372036854775807
               #define LLONG\_MIN     -9223372036854775807
               #define MB\_LEN\_MAX                       1
               #define SCHAR\_MAX                     +127
               #define SCHAR\_MIN                     -127
               #define SHRT\_MAX                    +32767
               #define SHRT\_MIN                    -32767
               #define UCHAR\_MAX                      255
               #define USHRT\_MAX                    65535
               #define UINT\_MAX                     65535
               #define ULONG\_MAX               4294967295
               #define ULLONG\_MAX    18446744073709551615

Así que char <= short <= int <= long <= long long

y

CHAR_BIT * sizeof (char) >= 8
CHAR_BIT * sizeof (short) >= 16
CHAR_BIT * Größe von (int) >= 16
CHAR_BIT * sizeof (long) >= 32
CHAR_BIT * sizeof (long long) >= 64

3voto

Johan Kotlinski Punkte 24241

Ja, C++-Typengrößen werden von C89 geerbt.

Ich kann die Spezifikation im Moment nicht finden. Aber sie steht in der Bibel .

3voto

Peer Stritzinger Punkte 8052

Beachten Sie, dass die garantierten Reichweiten bei diesen Typen um eins geringer sind als bei den meisten Maschinen:

signed char -127 ... +127 garantiert, aber die meisten Zweierkomplementmaschinen haben -128 ... + 127

Das Gleiche gilt für die größeren Typen.

3voto

AnT Punkte 300728

In dem, was Sie lesen, sind mehrere Ungenauigkeiten enthalten. Diese Ungenauigkeiten waren entweder in der Quelle enthalten, oder Sie haben sich alles falsch gemerkt.

Zunächst eine pedantische Bemerkung zu einem merkwürdigen Unterschied zwischen C und C++. Die Sprache C bietet keine Garantien für die relative Größen von Integer-Typen (in Bytes). Die Sprache C gibt nur Garantien über ihre relative Bereiche . Es stimmt, dass der Bereich der int ist immer mindestens so groß wie der Bereich von short und so weiter. Allerdings ist es nach dem C-Standard formell zulässig, dass sizeof(short) > sizeof(int) . In diesem Fall werden die zusätzlichen Bits in short dienen würde als Auffüllbits nicht für die Wertdarstellung verwendet. Offensichtlich handelt es sich hierbei um etwas, das lediglich durch die Rechtssprache in der Norm erlaubt ist, und nicht um etwas, das man in der Praxis wahrscheinlich antrifft.

In C++ hingegen gibt die Sprachspezifikation Garantien sowohl für die relative Bereiche und relativ Größen der Typen, so dass in C++ zusätzlich zu der obigen, von C geerbten Bereichsbeziehung gewährleistet ist, dass sizeof(int) größer oder gleich ist als sizeof(short) .

Zweitens garantiert der C-Sprachstandard einen Mindestbereich für jeden Ganzzahlentyp (diese Garantien sind sowohl in C als auch in C++ vorhanden). Wenn man den Mindestbereich für den gegebenen Typ kennt, kann man immer sagen, wie viele wertbildende Bits die dieser Typ haben muss (als Mindestanzahl von Bits). Zum Beispiel ist es wahr, dass der Typ long muss mindestens 32 wertbildende Bits haben, um die Bereichsanforderungen zu erfüllen. Wenn Sie das neu berechnen wollen in Bytes hängt es davon ab, was Sie unter dem Begriff Byte . Wenn Sie speziell über 8-Bit-Bytes sprechen, dann geben Sie tatsächlich long wird immer aus mindestens vier 8-Bit-Bytes bestehen. Das bedeutet jedoch nicht, dass sizeof(long) ist immer mindestens 4, da in der C/C++-Terminologie der Begriff Byte bezieht sich auf char Objekte. char Objekte sind nicht auf 8 Bits beschränkt. Es ist durchaus möglich, 32-Bit char Typs in irgendeiner Implementierung, was bedeutet, dass sizeof(long) in C/C++ können Bytes zum Beispiel legal 1 sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X