2012-11-01 2 views
23

La taille de char, int, long double ... peut varier d'un compilateur à l'autre. Mais ai-je la garantie selon la norme C++ 11 ou C11 que la taille de tout type intégral fondamental signé et non signé est la même?Ai-je la garantie que sizeof (type) == sizeof (type non signé)?

+0

Je devrais l'espérer, à moins qu'il y ait en quelque sorte un type pour lequel l'inégalité a du sens, auquel cas, je serais heureux de l'entendre. – chris

+1

De même, sizeof char est toujours 1. char peut avoir une taille inhabituelle, comme 16 bits, mais sizeof char serait toujours 1 et sizeof un type 32 bits serait 2. –

Répondre

40

Le 11 C++ standard dit sur les types entiers:

(§3.9.1/3) Pour chacun des types entiers standard signé, il existe un correspondant (mais différent) standard de type entier non signé : «Unsigned char», «unsigned short int», «unsigned int», «unsigned long int» et «unsigned long long int», chacun occupant la même quantité de stockage et ayant les mêmes exigences d'alignement (3.11) que le type entier signé correspondant; c'est-à-dire que chaque type entier signé a la même représentation d'objet que son type entier non signé correspondant. De même, pour chacun des types entiers étendus signés, il existe un type entier non signé étendu correspondant avec la même quantité d'exigences de stockage et d'alignement. [...]

Donc la réponse est oui.

Pour C11, il y a une déclaration correspondante ici (ce qui est de N1570):

(§6.2.5/6) Pour chacun des types entiers signés, il y a un correspondant (mais différent) Type entier non signé (désigné avec le mot-clé non signé) qui utilise la même quantité de stockage (y compris les informations de signe) et a les mêmes exigences d'alignement [...]

-1

Oui, il y a une garantie complète qui sizeof (type signé) est égal à sizeof (type non signé puisque unsigned ne prend que l'espace des nombres négatifs de type signé pour augmenter sa portée.

+1

Rien dans la norme exige que «UINT_MAX > INT_MAX'; Les machines de magnitude-signe peuvent les rendre égales. – supercat