Y at-il des machines, où sizeof (char)! = 1, ou au moins CHAR_BIT> 8?
Question
Y at-il des machines (ou compilateurs), où sizeof(char) != 1
?
Est norme C99 indique que la mise en œuvre sizeof(char)
norme de conformité doit être exactement 1? Dans le cas contraire, s'il vous plaît, donnez-moi le numéro de la section et la citation.
Mise à jour:
Si j'ai une machine (CPU), qui ne peut pas traiter octets (lecture minimale est de 4 octets, alignés), mais seulement 4 s d'octets (uint32_t
), peut compilateur pour définir cette machine sizeof(char)
à 4? sizeof(char)
sera 1, mais ombles aura 32 bits (macros CHAR_BIT
)
Update2: Mais résultat sizeof est pas un BYTES! il est la taille de CHAR. Et omble chevalier peut être 2 octets ou (peut-être) 7 bits?
Update3:
D'accord. Toutes les machines ont sizeof(char) == 1
. Mais quelles machines ont CHAR_BIT > 8
?
La solution
Il est toujours l'un à C99, section 6.5.3.4:
Lorsqu'il est appliqué à un opérande qui a type char, char non signé ou signé char, (ou une version de celui-ci qualifié) 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. (Pré c99) p. 148:
Une unité de stockage est considéré comme étant le quantité de stockage occupé par un personnage; la taille d'un objet 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 admissible d'avoir un C la mise en œuvre dans laquelle
char
type peut représentent des valeurs allant de -2147483648 par 2147483647? Si oui, quelle seraitsizeof(char)
en vertu de cette mise en œuvre? Quel serait être les plus petits et les plus grandes gammes de Typeint
?
Réponse (ibid, p 382.):
Il est permis (si inutile) pour un la mise en oeuvre d'utiliser 32 bits à représenter le type
char
. Outre le fait que la mise en œuvre, la valeur desizeof(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 norme C99 et Harbison et Steele.
Edit: En fait (ce qui est en réponse à votre question UPD 2), en ce qui concerne C99 est sizeof(char)
est en octets, à nouveau de la section 6.5.3.4:
L'opérateur sizeof donne la taille (En octets) de son opérande
si combiné avec la citation ci-dessus, les octets de 8 bits et que char
4 de ces octets est impossible. C99 pour un octet est identique à un char
En réponse à votre mention de la possibilité d'un 7 bits char
: ce n'est pas possible dans C99. Conformément à l'article 5.2.4.2.1 de la norme minimum est 8:
Les valeurs définies par la mise en œuvre, sont égaux ou plus [je souligne] ordre de grandeur que ceux indiqués, avec le même signe.
- nombre de bits pour objet le plus petit qui ne soit pas un champ de bits (octet)
**CHAR_BIT 8**
- valeur minimale pour un objet de char de type signé
**SCHAR_MIN -127//−(27−1)**
- valeur maximale pour un objet de char de type signé
**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é comme un nombre entier signé lorsque utilisé dans une expression, la valeur de CHAR_MIN est identique à celui de SCHAR_MIN et la valeur de CHAR_MAX est le même que celui de SCHAR_MAX. Dans le cas contraire, la valeur de CHAR_MIN est 0 et la valeur de CHAR_MAX est identique à celui de UCHAR_MAX. La valeur UCHAR_MAX doit être égale à 2 ^ CHAR_BIT -. 1
Autres conseils
Il n'y a pas de machines où sizeof(char)
est 4. Il est toujours 1 octet. Ce octet peut contenir 32 bits, mais pour autant que le compilateur C est concerné, il est un octet. Pour plus de détails, je vais en fait vous pointez sur FAQ C 26.6 . Ce lien couvre assez bien et je suis assez certain C ++ a toutes ces règles de C. Vous pouvez également consulter comp.lang.c FAQ 8,10 pour les caractères plus grands que 8 bits.
UPD2: Mais résultat sizeof est pas un BYTES ! il est la taille de CHAR. Et omble chevalier peut soit deux octets, ou (peut-être) 7 bits?
Oui, il est octets. Permettez-moi de le dire encore. sizeof(char)
est 1 octet en fonction du compilateur C. Ce que les gens appellent familièrement un octet (8 bits) ne sont pas nécessairement les mêmes 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 au moins 8.
PDP-10 et PDP-11 était.
Mise à jour: il pas comme 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, aurait.
Mise à jour: Il y a GCC 3.2 pour PDP-10 = 9 avec CHAR_BIT (Chèque include / limits.h dans cette archive).