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

7

Ich weiß, dass der C ++ Standard explizit die Größe von nur char , signed char und unsigned char garantiert. Es gibt auch Garantien, dass, sagen wir, short ist mindestens so groß wie char , int so groß wie short usw. Aber keine expliziten Garantien über den absoluten Wert von, sagen wir, sizeof(int) . Das war die Info in meinem Kopf und ich lebte glücklich damit. Vor einiger Zeit stieß ich jedoch auf einen Kommentar in SO (kann nicht finden), dass in C long garantiert mindestens 4 Bytes ist, und diese Anforderung wird von C ++ "geerbt". Ist das der Fall? Wenn ja, welche anderen impliziten Garantien haben wir für die Größen der arithmetischen Typen in C ++? Bitte beachten Sie, dass ich mich in diesen Fragen nicht für praktische Garantien auf verschiedenen Plattformen interessiert, sondern nur für theoretische .

    
Armen Tsirunyan 03.11.2010, 21:23
quelle

7 Antworten

13

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

Der ISO C90-Standard ist schwierig zu erreichen, was eine Schande ist, wenn man bedenkt, dass C ++ sich darauf verlässt, aber der Abschnitt "Numerische Grenzen" (2.2.4.2 in einem zufälligen Entwurf) wurde einmal gefunden herum) gibt Minimalwerte für die INT_MAX usw. Konstanten in <limits.h> . Zum Beispiel muss ULONG_MAX mindestens 4294967295 sein, woraus wir schließen können, dass die Breite von long mindestens 32 Bit beträgt.

Es gibt ähnliche Einschränkungen im C99-Standard, aber natürlich sind es nicht die, die von C ++ 03 referenziert werden.

Dies garantiert nicht , dass long mindestens 4 Bytes lang ist, da in C und C ++ "byte" grundsätzlich als "char" definiert ist, und es ist nicht garantiert, dass CHAR_BIT ist 8 in C oder C ++. CHAR_BIT == 8 wird sowohl von POSIX als auch von Windows garantiert.

    
Steve Jessop 03.11.2010, 21:34
quelle
12

Ich weiß nichts über C ++. In C hast du

%Vor%

Also char & lt; = short & lt; = int & lt; = long & lt; = long long

und

CHAR_BIT * sizeof (char) & gt; = 8
CHAR_BIT * sizeof (kurz) & gt; = 16
CHAR_BIT * Größe von (int) & gt; = 16
CHAR_BIT * sizeof (long) & gt; = 32
CHAR_BIT * sizeof (lang lang) & gt; = 64

    
pmg 03.11.2010 21:31
quelle
3

Ja, C ++ - Typgrößen werden von C89 übernommen.

Ich kann die Spezifikation jetzt nicht finden. Aber es ist in der Bibel .

    
Johan Kotlinski 03.11.2010 21:31
quelle
3

Beachten Sie, dass die garantierten Bereiche dieser Typen um eins weniger breit sind als bei den meisten Maschinen:

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

Gleiches gilt für die größeren Typen.

    
Peer Stritzinger 03.11.2010 21:35
quelle
2

Es gibt einige Ungenauigkeiten in dem, was Sie lesen. Diese Ungenauigkeiten waren entweder in der Quelle vorhanden, oder vielleicht erinnerten Sie sich alles falsch.

Zunächst eine pedantische Bemerkung über einen eigentümlichen Unterschied zwischen C und C ++. C-Sprache gibt keine Garantien über die relativen Größen der Integer-Typen (in Bytes). C-Sprache gibt nur Garantien über ihre relativen Bereiche . Es stimmt, dass der Bereich von int immer mindestens so groß ist wie der Bereich von short und so weiter. Es ist jedoch formal vom C-Standard erlaubt, sizeof(short) > sizeof(int) zu haben. In diesem Fall würden die zusätzlichen Bits in short als Padding-Bits dienen, die nicht für die Wertdarstellung verwendet werden. Offensichtlich ist dies etwas, das nur von der Rechtssprache in der Norm erlaubt ist, nicht etwas, auf das man in der Praxis wahrscheinlich stoßen wird.

Andererseits macht die Sprachspezifikation in C ++ Garantien sowohl für die relativen Bereiche als auch für die relativen Größen der Typen, also in C ++ zusätzlich zum obigen Bereich Beziehung geerbt von C ist garantiert, dass sizeof(int) größer oder gleich sizeof(short) ist.

Zweitens garantiert der C-Sprachenstandard eine minimale Reichweite für jeden Integer-Typ (diese Garantien sind sowohl in C als auch in C ++ vorhanden). Wenn Sie den minimalen Bereich für den gegebenen Typ kennen, können Sie immer angeben, wie viele wertbildende Bits dieser Typ haben soll (als minimale Anzahl von Bits). Zum Beispiel ist es richtig, dass der Typ long mindestens 32 wertbildende Bits haben muss, um seine Bereichsanforderungen zu erfüllen. Wenn Sie das in Bytes neu berechnen möchten, hängt es davon ab, was Sie unter dem Begriff Byte verstehen. Wenn Sie speziell über 8-Bit-Bytes sprechen, besteht der Typ long in der Tat immer aus mindestens vier 8-Bit-Bytes. Das bedeutet jedoch nicht, dass sizeof(long) immer mindestens 4 ist, da in der C / C ++ - Terminologie der Begriff Byte auf char -Objekte verweist. char -Objekte sind nicht auf 8 Bits beschränkt. Es ist durchaus möglich, 32-Bit char type in einer Implementierung zu haben, was bedeutet, dass sizeof(long) in C / C ++ Bytes beispielsweise legal 1 sein kann.

    
AnT 03.11.2010 22:38
quelle
1

Der C-Standard sagt nicht explizit, dass long mindestens 4 Byte sein muss, aber sie geben einen minimalen Bereich für die verschiedenen ganzzahligen Typen an, was eine minimale Größe impliziert.

Zum Beispiel ist der minimale Bereich von unsigned long 0 bis 4.294.967.295. Sie benötigen mindestens 32 Bits, um jede einzelne Zahl in diesem Bereich darzustellen. Also ja, die Standardgarantie (indirekt), dass ein long mindestens 32 Bit ist.

C ++ erbt die Datentypen von C, Sie müssen also den C-Standard betrachten. Der C ++ - Standard verweist in diesem Fall tatsächlich auf Teile des C-Standards.

    
In silico 03.11.2010 21:31
quelle
1

Seien Sie vorsichtig bei der Tatsache, dass einige Maschinen Zeichen mit mehr als 8 Bit haben. Zum Beispiel, IIRC auf der TI C5x, eine lange ist 32 Bits, aber sizeof (lang) == 2, weil Zeichen, Kurzschlüsse und Ints sind alle 16 Bits mit sizeof (char) == 1.

    
Jean-Marc Valin 03.11.2010 22:00
quelle

Tags und Links