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:
- 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:
- [...] 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:
- 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)
où 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.
La Norme C++ spécifiquement dit que pour connaître le C++, vous devez savoir, C (1.2/1) 1
Le Standard C++ définit implicitement la limite minimale sur les valeurs,
long
peuvent accueillir jusqu'à êtreLONG_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