2010-02-07 23 views
86

Existe-t-il des machines (ou des compilateurs), où sizeof(char) != 1?Y a-t-il des machines, où sizeof (char)! = 1, ou au moins CHAR_BIT> 8?

Est-ce que C99 standard dit que sizeof(char) sur l'implémentation de conformité standard DOIT être exactement 1? Si c'est le cas, donnez-moi le numéro de la section et la référence.

Mise à jour: Si j'ai une machine (CPU), qui ne peut pas traiter octets (lecture minimale est de 4 octets, aligné), mais seulement 4 s d'octets (uint32_t), peut compilateur pour cette définir la machine sizeof(char) à 4? sizeof(char) sera 1, mais ombles aura 32 bits (CHAR_BIT macros)

Update2: Mais résultat sizeof est pas un BYTES! c'est la taille de CHAR. Et char peut être 2 octets, ou (peut-être) 7 bits?

Mise à jour 3: Ok. Toutes les machines ont sizeof(char) == 1. Mais quelles machines ont CHAR_BIT > 8?

+0

Qu'est-ce qui vous inquiète vraiment? Vous n'aimez pas appeler sizeof()? –

+4

Je m'inquiète de la conformité aux normes C99. Je travaille étroitement avec les compilateurs C99 – osgx

+2

Comme Unicode devient encore plus important, il peut y avoir des compilateurs non standard qui utilisent des caractères Unicode comme 'char' (au lieu de' wchar'.) Même si la norme dit que 'sizeof (char)' doit être 1, je ne compterais pas sur cette hypothèse. –

Répondre

86

Il est toujours l'un à C99, section 6.5.3.4:

Appliqué à un opérande qui a type char, char non signé ou signé char, (ou une version qualifiée de celui-ci) la le résultat est 1.

Éditez: pas une partie de votre question, mais pour l'intérêt de Harbison et Steele, 3ème éd. (avant c99) p. 148:

Une unité de stockage est considéré comme étant la quantité de stockage occupé par une caractère; la taille d'un objet de de type char est donc 1.

Edit: En réponse à votre question mise à jour, la question suivante et la réponse de Harbison et Steele est pertinent (. ibid., Ex 4 Ch 6) :

est-il permis d'avoir une mise en œuvre C dans quel type char peut représenter des valeurs allant de -2147483648 par 2147483647? Si oui, que serait sizeof(char) sous cette implémentation? Quelle serait être les plus petites et plus grandes plages de type int?

Réponse (ibid, p 382.):

Il est permis (si inutile) pour une mise en œuvre à utiliser 32 bits pour représenter le type char. Indépendamment de la mise en œuvre, la valeur sizeof(char) est toujours 1.

Bien que cela ne traite pas spécifiquement un cas où, disons octets sont 8 bits et char sont 4 de ces octets (en fait impossible la définition c99, voir ci-dessous), le fait que sizeof(char) = 1 est toujours clair de la C99 standard et Harbison et Steele.

Edit: En fait (ce qui est en réponse à votre UPD 2 question), en ce qui c99 concerne sizeof(char)est en octets, de la section 6.5.3.4 à nouveau:

Le rendement de l'opérateur de sizeof la taille (en octets) de son opérande

si combinée avec la citation ci-dessus, les octets de 8 bits et que char 4 de ces octets est impossible car c99 un octet est identique à un char.

En réponse à votre mention de la possibilité d'un char 7 bits: ce n'est pas possible en C99. Conformément à l'article 5.2.4.2.1 de la norme du minimum est 8:

Leurs valeurs définies par la mise en œuvre, sont égaux ou plus [je souligne] en grandeur à celles indiquées, avec le même signe.

- nombre de bits pour objet plus petit qui ne soit pas un champ de bits (octet)

**CHAR_BIT 8** 

- valeur minimale pour un objet de type signed char

**SCHAR_MIN -127//−(27−1)** 

- valeur maximale pour un objet de type signé char

**SCHAR_MAX +127//27−1** 

- valeur maximale pour un objet de type unsigned char

**UCHAR_MAX 255//28−1** 

- valeur minimale pour un objet de type char

**CHAR_MIN** see below 

- valeur maximale pour un objet de type char

**CHAR_MAX** see below 

[...]

Si la valeur d'un objet de type char est traitée comme integ signé er lorsque utilisé dans une expression, la valeur de CHAR_MIN doit être la même que celle de SCHAR_MIN et la valeur de CHAR_MAX doit être la même que celle de SCHAR_MAX. Sinon, la valeur de CHAR_MIN doit être 0 et la valeur de CHAR_MAX doit être la même que celle de UCHAR_MAX. La valeur UCHAR_MAX doit être égale à 2^CHAR_BIT - 1.

+9

Note supplémentaire: il y a une macro CHAR_BITS qui vous dira combien de bits vos caractères sont – nos

+1

Les données complètes de ce grand livre sont * Harbison et Steele.C: Un manuel de référence, troisième édition, Prentice Hall, 1991 * – osgx

+0

Oui, merci de mettre le titre, c'est le Harbison et Steele que je cite ci-dessus (notez qu'il ne couvre pas c99). – Ramashalanka

16

Il n'y a pas de machines où sizeof(char) est de 4. Il est toujours 1 octet.Cet octet peut contenir 32 bits, mais en ce qui concerne le compilateur C, il s'agit d'un octet. Pour plus de détails, je vais vous pointer au C++ FAQ 26.6. Ce lien couvre assez bien et je suis assez certain que C++ a toutes ces règles de C. Vous pouvez également regarder comp.lang.c FAQ 8.10 pour les caractères de plus de 8 bits.

UPD2: Mais résultat sizeof est pas un BYTES ! c'est la taille de CHAR. Et char peut être 2 octets, ou (peut être) 7 bits?

Oui, il s'agit d'octets. Permettez-moi de le dire encore. sizeof(char) est 1 octet selon le compilateur C. Ce que les gens appellent familièrement un octet (8 bits) n'est pas nécessairement le même que ce que le compilateur C appelle un octet. Le nombre de bits dans un octet C varie en fonction de l'architecture de votre machine. Il est également garanti d'être au moins de 8.

+2

S'il vous plaît !!! C++ est le langage vraiment DIFFERENT de C (C99). Cette question concerne uniquement le C pur. – osgx

+0

Que puis-je faire lorsque la machine/le processeur ne peut pas accéder aux octets de 8 bits? L'accès non aligné est interdit. (Même sur x86, malloc renvoie des données alignées et alloue de la mémoire en multipliant 4 octets.) Alors CHAT_BIT sera supérieur à 8. Oui, cette plate-forme peut être plutôt spéciale. osgx

+9

@osgx, j'ai tendance à crier autant que vous venez de le faire quand les gens essaient de mélanger C et C++. Mais je pense ** dans ce cas ** qu'une entrée de FAQ C++ s'applique aussi bien à C. –

8

PDP-10 et PDP-11 était.

Mise à jour: il n'existe pas de compilateurs C99 pour PDP-10.

Certains modèles de Analog Devices 32 bits SHARC DSP ont CHAR_BIT = 32, et Texas Instruments DSP de TMS32F28xx ont CHAR_BIT = 16, reportedly. Mise à jour: Il existe GCC 3.2 for PDP-10 avec CHAR_BIT = 9 (vérifiez include/limits.h dans cette archive).

+1

Ne confondez pas les implémentations de langages similaires mais non-C avec C. Vous avez même dit "Je m'inquiète de la conformité aux normes C99, je travaille en étroite collaboration avec les compilateurs C99". –

+1

@Roger: Il n'est pas juste d'appeler GCC3 non conforme à la norme C99 à moins que vous ne traitiez des cas extrêmes qui sont considérés comme des bugs dans GCC. – Joshua

+1

@Joshua, je pense que Roger dit à propos de compilateurs historiques K & R et pcc. Il n'est pas non plus juste de prétendre que C99 est conforme avant que la suite de tests de conformité C99 ne soit exécutée sur PDP-10, lorsqu'il est compilé avec ce port (il peut y avoir des bugs de portage et de la machine elle-même). Mais on peut s'attendre à être proche de la norme C99 comme le fait GCC3.2 sur x86. – osgx