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?

Était-ce utile?

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 serait sizeof(char)   en vertu de cette mise en œuvre? Quel serait   être les plus petits et les plus grandes gammes de   Type int?

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 de   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 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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top