2012-05-27 1 views
16

J'ai lu quelques fois dans différentes sources (par exemple Wikipedia: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size), qu'en C, une longue n'est pas plus petite qu'un long, qui n'est pas plus petit qu'un int, qui n'est pas plus petit qu'un court."int" vraiment nécessaire d'être au moins aussi grand que "court" en C?

Cependant, j'ai regardé cela dans les normes C90 et C99, et je n'ai pas trouvé de clause correspondante. J'ai trouvé seulement que C90 et C99 spécifient les tailles de caractères minimales (Section 5.2.4.2.1 dans les normes C90 et C99), mais pas leurs tailles les unes par rapport aux autres. Est-ce que j'ai manqué quelque chose dans les normes?

+4

Non, mais je n'ai pas vu une plate-forme qui rend 'short' plus grand que' int' ... et c'est précisément pourquoi j'utilise '', chaque fois que je doute de choses comme ça –

Répondre

13

6.3.1.1 définit la classe de conversion de nombre entier par rapport de deux des types de nombres entiers. C'est un concept abstrait qui vise uniquement à définir la relation entre deux types; il n'y a pas de valeur définie comme de rang de n'importe quel type.

6.2.5p8 dit:

Pour tout deux types entiers avec le même signedness et différent rang de conversion entier (voir 6.3.1.1), la plage de valeurs du type avec un rang de conversion entier inférieur est une sous-plage des valeurs de l'autre type.

Il ne dit rien au sujet de leurs tailles relatives , et en fait, il est théoriquement possible pour une mise en œuvre conforme (mais délibérément pervers) d'avoir sizeof (short) > sizeof (int). Ceci n'est possible que si short a plus de bits de remplissage (bits qui ne contribuent pas à la valeur) que int. C'est très improbable; la plupart des implémentations n'ont pas de bits de remplissage, et je ne connais aucune implémentation où les relations des gammes de types entiers diffèrent des relations de leurs tailles.

Référence: soit N1256, le dernier brouillon C99, ou N1570, le dernier brouillon C2011.

+0

Merci pour les informations supplémentaires :) –

10

Je suppose que l'article de Wikipedia fait référence à la plage de valeurs de ces types entiers, plutôt que leur taille (tel que rapporté par sizeof).

De C99 standard draft N1256:

6.3.1.1/1

Le rang de long long int sera supérieur au rang de long int, qui sera supérieur au rang de int, qui doit être supérieur au rang short int, qui doit être supérieur au rang signed char.

6.2.5/8

Pour les deux types d'entiers avec le même signedness et différent rang de conversion de nombre entier (voir 6.3.1.1), la plage de valeurs du type à petite Le rang de conversion entier est un sous-intervalle des valeurs de l'autre type.

+0

That doesn pas complètement répondre à la question. Le niveau de conversion relative n'implique en fait rien à propos de la taille relative. –

6

De C2011 Standard

6.3.1.1/1

- Le rang de long int doit être supérieur au rang de long int, qui doit être supérieure à le rang de int, qui doit être supérieur au rang de court int, qui doit être supérieur au rang car.