Y a-t-il des machines (ou des compilateurs), où sizeof(char) != 1
?
La norme C99 indique- t-elle que la sizeof(char)
mise en œuvre de la conformité standard DOIT être exactement 1? Si c'est le cas, veuillez me donner le numéro de section et la citation.
Mise à jour:
Si j'ai une machine (CPU), qui ne peut pas adresser les octets (la lecture minimale est de 4 octets, alignés), mais seulement 4-s d'octets ( uint32_t
), le compilateur pour cette machine peut-il définir sizeof(char)
à 4? sizeof(char)
sera 1, mais char aura 32 bits ( CHAR_BIT
macros)
Update2: Mais la taille du résultat n'est PAS un BYTES! c'est la taille de CHAR. Et char peut être 2 octets, ou (peut-être) 7 bits?
Update3:
Ok. Toutes les machines ont sizeof(char) == 1
. Mais quelles machines ont CHAR_BIT > 8
?
char
(au lieu dewchar
). Même si la norme dit que celasizeof(char)
doit être 1, je ne me fierais pas à cette hypothèse.sizeof(char)
vaut toujours 1, même si char est de 32 bits (comme cela se produit sur certains systèmes). C a beaucoup de verrues amusantes.sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
sur celles-ci; je ne me souviens passizeof(int) == sizeof(long)
si CHAR_BIT avait 32 ou 64; je suppose que c'était 32, et je pensesizeof(long) == 1
aussi. (Vous pouvez trouver une référence, mais pas un accès en ligne, à un manuel Cray C ).Réponses:
Il en est toujours un dans C99, section 6.5.3.4:
Edit: ne fait pas partie de votre question, mais pour l'intérêt de Harbison et Steele, 3e éd. (avant c99) p. 148:
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):
Réponse (ibid, p. 382):
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 celasizeof(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: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 à achar
.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)
- valeur minimale pour un objet de type char signé
- valeur maximale pour un objet de type char signé
- valeur maximale pour un objet de type char non signé
- valeur minimale pour un objet de type char
- valeur maximale pour un objet de type char
[...]
la source
sizeof(char)
: c'est un autre élément à débattre / vérifier / etc. dans vos conventions de codage / normes / directives, me fait perdre mon temps à me demander si vous connaissez vraiment C et quoi d'autre peut être incorrect, prend de la «bande passante» visuelle / mentale / text-line.Il n'y a pas de machines avec
sizeof(char)
4. C'est toujours 1 octet. Cet octet peut contenir 32 bits, mais en ce qui concerne le compilateur C, c'est un octet. Pour plus de détails, je vais vous diriger vers la FAQ C ++ 26.6 . Ce lien le couvre assez bien et je suis assez certain que C ++ a obtenu toutes ces règles de C. Vous pouvez également consulter la FAQ 8.10 de comp.lang.c pour les caractères de plus de 8 bits.Oui, ce sont des octets. Permettez-moi de le dire encore.
sizeof(char)
est de 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 être d'au moins 8.la source
PDP-10
et PDP-11 l'étaient.Mise à jour:
il n'y a pas de compilateurs C99 pour PDP-10.Certains modèles de DSP SHARC 32 bits d'Analog Devices ont CHAR_BIT = 32 et le DSP Texas Instruments de TMS32F28xx a CHAR_BIT = 16, apparemment .
Mise à jour: Il existe GCC 3.2 pour PDP-10 avec CHAR_BIT = 9 (vérifiez include / limits.h dans cette archive).
la source