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.
Qu'est-ce qui vous inquiète vraiment? Vous n'aimez pas appeler sizeof()? –
Je m'inquiète de la conformité aux normes C99. Je travaille étroitement avec les compilateurs C99 – osgx
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. –