Il en est toujours un dans C99, section 6.5.3.4:
Lorsqu'il est appliqué à un opérande de type char, unsigned char ou signé char, (ou une version qualifiée de celui-ci), le résultat est 1.
Edit: ne fait pas partie de votre question, mais pour l'intérêt de Harbison et Steele, 3e éd. (avant c99) p. 148:
Une unité de stockage est considérée comme la quantité de stockage occupée par un caractère; la taille d'un objet de type char
est donc 1.
Edit: En réponse à votre question mise à jour, la question et la réponse suivantes de Harbison et Steele sont pertinentes (ibid, Ex.4 du Ch.6):
Est-il permis d'avoir une implémentation C dans laquelle le type char
peut représenter des valeurs allant de -2 147 483 648 à 2 147 483 647? Dans l'affirmative, que serait sizeof(char)
cette mise en œuvre? Quelles seraient les gammes les plus petites et les plus grandes de type int
?
Réponse (ibid, p. 382):
Il est permis (en cas de gaspillage) pour une implémentation d'utiliser 32 bits pour représenter le type char
. Quelle que soit l'implémentation, la valeur de
sizeof(char)
est toujours 1.
Bien que cela ne traite pas spécifiquement d'un cas où, disons que les octets sont 8 bits et char
sont 4 de ces octets (en fait impossible avec la définition c99, voir ci-dessous), le fait que cela sizeof(char) = 1
ressort toujours clairement de la norme c99 et de Harbison et Steele.
Edit: En fait (c'est en réponse à votre question upd 2), en ce qui concerne c99 sizeof(char)
est en octets, à partir de la section 6.5.3.4 encore:
L'opérateur sizeof donne la taille (en octets) de son opérande
ainsi combiné avec la citation ci-dessus, des octets de 8 bits et char
4 de ces octets est impossible: pour c99, un octet équivaut à a char
.
En réponse à votre évocation de la possibilité d'un 7 bits char
: ce n'est pas possible en c99. Selon la section 5.2.4.2.1 de la norme, le minimum est de 8:
Leurs valeurs définies par l'implémentation doivent être égales ou supérieures [je souligne] en grandeur à celles indiquées, avec le même signe.
- nombre de bits pour le plus petit objet qui n'est pas un champ de bits (octet)
**CHAR_BIT 8**
- valeur minimale pour un objet de type char signé
**SCHAR_MIN -127//−(27−1)**
- valeur maximale pour un objet de type char signé
**SCHAR_MAX +127//27−1**
- valeur maximale pour un objet de type char non signé
**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 un entier signé lorsqu'il est 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 sera égale à 2 ^ CHAR_BIT - 1.