51 votes

Est-ce que «long» est garanti d'avoir au moins 32 bits?

Par ma lecture de la Norme C++, j'ai toujours entendu que les tailles de l'intégrale types fondamentaux en C++ ont été comme suit:

sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)

J'en ai déduit cela de 3.9.1/2:

  1. Il y a quatre signé types d'entiers: "signed char", "short int", "int" et "long int." Dans cette liste, chaque type offre au moins autant de stockage comme ceux qui le précèdent dans l' liste. Plaine ints ont la taille naturelle proposé par l'architecture de la environnement d'exécution

De plus, la taille de l' char est décrit par 3.9.1/ comme étant:

  1. [...] assez grand pour stocker tous les membres de la mise en œuvre du jeu de caractères de base.

1.7/1 définit en des termes plus concrets:

  1. Les fondamentaux de l'unité de stockage dans le C + + modèle de mémoire est l'octet. Un octet est au moins assez grand pour contenir tout membre de l'exécution de base jeu de caractères et est composée d'une séquence contiguë de bits, le nombre de ce qui est de la mise en œuvre définies.

Ce qui m'amène à la conclusion suivante:

1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)

sizeof nous indique combien d'octets sont le type est. En outre, la mise en œuvre est définie par la quantité de bits dans un octet. La plupart d'entre nous sommes habitués à traiter avec des octets de 8 bits, mais que dit la Norme il y a n bits dans un octet.


Dans ce post, Alf P. Steinbach dit:

est la durée de garantie (au moins) de 32 bits.

Cela va à l'encontre de tout ce que je comprends de la taille des types fondamentaux pour être en C++ selon la Norme. Normalement, j'aurais juste remise de cette déclaration comme un débutant d'être mauvais, mais comme il s'agissait de la Fal j'ai décidé qu'il était utile de l'examiner plus avant.

Alors, qu'en dites-vous? Est une longue garantie par la norme d'au moins 32 bits? Si oui, veuillez préciser comment cette garantie est faite. Je n'ai juste pas le voir.

  1. La Norme C++ spécifiquement dit que pour connaître le C++, vous devez savoir, C (1.2/1) 1

  2. Le Standard C++ définit implicitement la limite minimale sur les valeurs, long peuvent accueillir jusqu'à être LONG_MIN-LONG_MAX 2

Donc, peu importe comment grand un long est, il doit être assez grand pour contenir LONG_MIN à LONG_MAX.

Mais Fal et d'autres sont spécifiques d'un long doit être d'au moins 32 bits. C'est ce que je suis en train d'établir. La Norme C++ est explicite sur le fait que le nombre de bits dans un octet ne sont pas spécifiés (il pourrait être de 4, 8, 16, 42) Alors, comment est la connexion faite de pouvoir accueillir le nombre LONG_MIN-LONG_MAX à être au moins 32 bits?


(1) 1.2/1: Les documents de référence suivants sont indispensables pour l'application du présent document. Pour les références datées, seule l'édition citée s'applique. Pour les références non datées, la dernière édition du document référencé (y compris les éventuels amendements) s'applique.

  • L'ISO/CEI 2382 (toutes les parties), technologie de l'Information – Vocabulaire
  • ISO/IEC 9899:1999, les langages de Programmation – C
  • L'ISO/CEI 10646-1:2000 technologies de l'Information – jeu Universel de Multiples Octet Coded Character Set (UCS) – Partie 1: Architecture et Plan Multilingue de Base

(2) Défini dans l' <climits> comme:

LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 //   2^31 - 1

37voto

MSN Points 30386

C++ utilise les limites définies dans la norme C (C++: 18.3.2 (c.les limites), C: 5.2.4.2.1):

LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 //   2^31 - 1

Afin de vous garantir une longue d'au moins 32 bits.

Et si vous voulez suivre le long des voies détournées pour s' LONG_MIN/LONG_MAX sont représentable par un long, vous avez à regarder 18.3.1.2 (numérique.les limites.les membres) dans la norme C++:

static constexpr T min() throw(); // Equivalent to CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, etc.
static constexpr T max() throw(); // Equivalent to CHAR_MAX, SHRT_MAX, FLT_MAX, DBL_MAX, etc.

J'ai déplacé les notes de bas de page dans le commentaire, si ce n'est pas exactement ce qui apparaît dans la norme. Mais elle implique essentiellement que std::numeric_limits<long>::min()==LONG_MIN==(long)LONG_MIN et std::numeric_limits<long>::max()==LONG_MAX==(long)LONG_MAX.

Donc, même si le C++ standard ne précise pas la bit-à-bit de la représentation de (signé) les nombres négatifs, il doit soit être deux-compléter et nécessitent 32-bits de stockage au total, ou il a un signe explicite bits, ce qui signifie qu'il dispose de 32-bits de stockage aussi.

17voto

John Dibling Points 56814

La réponse est définitivement OUI. Lire mon OP et tous les commentaires pour comprendre exactement pourquoi, mais voici la version courte. Si vous avez un doute ou une question de tout cela, je vous encourage à lire tout le fil et tous les commentaires. Sinon l'accepter comme vrai:

  1. Le C++ standard comprend des parties de la norme, y compris les définitions LONG_MIN et LONG_MAX
  2. LONG_MIN est définie comme l'absence de supérieure à -2147483647
  3. LONG_MAX est définie comme l'absence de moins de +2147483647
  4. En C++ les types intégraux sont stockés en binaire dans la représentation sous-jacente
  5. Afin de représenter -2147483647 et +2147483647 en binaire, vous avez besoin de 32 bits.
  6. C++ est la durée de garantie pour être en mesure de représenter le minimum LONG_MIN par LONG_MAX

Donc un long doit être d'au moins 32 bits1.

EDIT:

LONG_MIN et LONG_MAX ont des valeurs avec des magnitudes dicté par la norme (ISO/IEC 9899:TC3) dans la section §5.2.4.2.1:

[...] Leur mise en œuvre-la définition des valeurs doit être égale ou de plus grande ampleur [...] (valeur absolue) à celles indiquées, avec le même signe [...]

- minimum value for an object of type long int
LONG_MIN -2147483647 // -(231 - 1)
- maximum value for an object of type long int
LONG_MAX +2147483647 // 231 - 1

132 bits: Cela ne signifie pas qu' sizeof (long) >= 4, en raison d'un octet n'est pas nécessairement de 8 bits. Selon la Norme, un octet est certains indéterminée (plate-forme) nombre de bits. Alors que la plupart des lecteurs trouveront cela étrange, il est vrai matériel sur lequel CHAR_BIT est de 16 ou 32.

7voto

birryree Points 29165

La norme C ++ note que les contenus de <climits> sont identiques à ceux de l'en-tête C <limits.h> (18.2.2 dans la documentation ISO C ++ 03).

Malheureusement, je n'ai pas de copie du standard C qui existait avant C ++ 98 (c'est-à-dire C90), mais en C99 (section 5.2.4.2.1), <limits.h> doit avoir au moins cette valeurs minimales. Je ne pense pas que cela ait changé par rapport à C90, sauf que C99 a ajouté les types long long .

 - minimum value for an object of type long int

LONG_MIN -2147483647 // −(2^31 − 1)

- maximum value for an object of type long int

LONG_MAX +2147483647 // 2^31 − 1

- maximum value for an object of type unsigned long int

ULONG_MAX 4294967295 // 2^32 − 1

- minimum value for an object of type long long int

LLONG_MIN -9223372036854775807 // −(2^63− 1)
 

7voto

Mais Fal et d'autres sont spécifiques d'un de temps doit être d'au moins 32 bits. C'est ce que je suis en train d'établir. Le C++ La norme est explicite sur le fait que le nombre de bits dans un octet ne sont pas spécifiés. Pourrait être de 4, 8, 16, 42... Alors, comment est le connexion fait d'être en mesure de accueillir des le nombre LONG_MIN-LONG_MAX d'être au moins 32 bits?

Vous avez besoin de 32 bits dans la représentation de la valeur afin d'obtenir au moins autant de bitpatterns. Et depuis C++ nécessite une représentation binaire des entiers (langage explicite à cet effet dans la norme, §3.9.1/7), à Q. E. D.

7voto

Karl Knechtel Points 24349

Oui, le C++ standard est explicite sur le fait que le nombre de bits dans un octet n'est pas spécifié. Le nombre de bits dans un long n'est pas spécifiée, soit.

Définition d'une limite inférieure sur un nombre n'est pas en précisant .

La norme C++ dit, en un seul endroit:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).

Il affirme, en effet, dans un autre lieu, par l'inclusion de la norme C:

CHAR_BITS >= 8; SHORT_BITS >= 16; INT_BITS >= 16; LONG_BITS >= 32

(sauf que, autant que je sache, les identifiants SHORT_BITS, INT_BITS et LONG_BITS n'existent pas, et que ces limites sont déterminés par les exigences pour les valeurs minimales sur les types.)

Cela découle du fait qu'un certain nombre de bits sont nécessaires, mathématiquement, pour coder toutes les valeurs de l' (par exemple pour les longs) LONG_MIN..LONG_MAX gamme.

Enfin, les shorts, les services de renseignements et de longs doivent tous être composé d'un nombre entier de caractères; sizeof() signale toujours une partie intégrante de la valeur. Aussi, le parcours de la mémoire char par char doit avoir accès à la quantité, ce qui impose certaines limites d'ordre pratique.

Ces exigences ne sont pas incompatibles de toute façon. Toutes les tailles qui satisfont les exigences sont OK.

Il y avait des machines il y a longtemps avec un natif de la taille de mot de 36 bits. Si vous avez été à port un compilateur C++, vous pouvait légalement décider de 9 bits dans un char, de 18 à la fois de court et de type int, et 36 en long. Vous pouvez aussi légalement décider d'avoir 36 bits dans chacun de ces types, pour la même raison que vous pouvez avoir 32 bits dans un int sur un système 32-bit aujourd'hui. Il y a dans le monde réel implémentations utiliser le 64 bits caractères.

Voir également les articles 26.1-6 et 29,5 du C++ FAQ Lite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X