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.
Antworten
Zu viele Anzeigen?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.
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
Ja, C++-Typengrößen werden von C89 geerbt.
Ich kann die Spezifikation im Moment nicht finden. Aber sie steht in der Bibel .
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.
- See previous answers
- Weitere Antworten anzeigen