111 votes

Existe-t-il des machines, où sizeof (char)! = 1?

Existe-il des machines (ou des compilateurs), où sizeof(char) != 1 ?

N' standard C99 dit qu' sizeof(char) sur le respect des standards de la mise en œuvre DOIT être exactement 1? Si elle le fait, s'il vous plaît, donnez-moi le numéro de la section et de la citation.

Mise à jour: Si j'ai une machine (CPU), qui ne permet pas d'adresse octets (minimal de lecture est de 4 octets, alignés), mais seulement 4-s d'octets (uint32_t), peut compilateur pour cette machine définissent sizeof(char) à 4? sizeof(char) 1, mais le char va avoir 32 bits (CHAR_BIT macros)

Update2: Mais sizeof résultat n'est PAS un OCTETS ! il est de la taille d'un CHAR. Et le char peut être de 2 octets, ou (peut-être) sur 7 bits?

Update3: Ok. Sur toutes les machines, sizeof(char) == 1. Mais quelles machines avez - CHAR_BIT > 8 ?

103voto

Ramashalanka Points 5481

Il est toujours l'un en C99, section 6.5.3.4:

Lorsqu'il est appliqué à un opérande qui a type de char, unsigned char, ou signé char, (ou d'une version de celui-ci) le résultat est 1.

Edit: pas partie de votre question, mais pour l'intérêt de Harbison et Steele, 3ème ed. (pré c99) p. 148:

Une unité de stockage est pris pour le quantité de stockage occupé par un caractère; la taille d'un objet de type char est donc 1.

Edit: En réponse à la mise à jour de votre question, la question suivante et sa réponse de Harbison et Steele est pertinente (ibid, Ex. 4 de Ch. 6):

Est-il permis d'avoir une C mise en œuvre dans le type charpeut représentent des valeurs allant de -2 147 483 648 à de 2 147 483 647? Si oui, quel serait sizeof(char) en vertu de cette mise en œuvre? Ce serait être la plus petite et la plus grande des plages de type int?

Réponse (ibid., p. 382):

Il est permis (si inutiles) pour un la mise en œuvre utilisation de 32 bits pour représenter type char. Indépendamment de la mise en œuvre, la valeur de sizeof(char) est toujours 1.

Bien que ce ne traitent pas précisément un cas où, disons octets de 8 bits et d' char 4 de ces octets (en fait impossible avec le c99 définition, voir ci-dessous), le fait qu' sizeof(char) = 1 toujours est clair à partir du standard c99 et Harbison et Steele.

Edit: En fait (c'est en réponse à votre upd 2 question), autant que le c99 est concerné sizeof(char) est en octets, à partir de la section 6.5.3.4 de nouveau:

L'opérateur sizeof donne la taille (en octets) de son opérande

donc, combinée avec la citation ci-dessus, les octets de 8 bits, et char que 4 de ces octets est impossible: c99, un octet est le même que pour un char.

En réponse à votre mention de la possibilité d'un 7 bits char: ce n'est pas possible en c99. Conformément à l'article 5.2.4.2.1 de la norme, le minimum est de 8:

Leur mise en œuvre-la définition des valeurs doit être égale ou supérieure à [mes italiques] en importance à celles indiquées, avec le même signe.

- nombre de bits pour le plus petit objet, qui n'est pas un bits (octet)

 **CHAR_BIT 8**

- valeur minimale pour un objet de type signed char

**SCHAR_MIN -127//−(27−1)** 

- le maximum de valeur pour un objet de type signed char

**SCHAR_MAX +127//27−1** 

- le maximum de valeur pour un objet de type unsigned char

**UCHAR_MAX 255//28−1** 

- valeur minimale pour un objet de type char

**CHAR_MIN**    see below 

- le maximum de valeur pour un objet de type char

**CHAR_MAX**    see below

[...]

Si la valeur d'un objet de type char est traité comme un entier signé lors de l' utilisé dans une expression, la valeur de CHAR_MIN doit être le même que celui de SCHAR_MIN et la valeur de CHAR_MAX doit être le même que celui de SCHAR_MAX. Sinon, la valeur de CHAR_MIN est 0 et la valeur de CHAR_MAX doit être le même que celui de UCHAR_MAX. La valeur UCHAR_MAX doit être égal à 2^CHAR_BIT − 1.

22voto

Michael Kristofik Points 16035

Il n'existe pas de machines, sizeof(char) 4. Il est toujours de 1 octet. Cet octet peut contenir 32 bits, mais aussi loin que le compilateur C est concerné, il est un octet. Pour plus de détails, je vais point vous à la C++ FAQ 26.6. Ce lien il couvre assez bien et je suis assez certain que C++ a obtenu l'ensemble de ces règles de C. Vous pouvez aussi regarder comp.lang.c FAQ 8.10 pour des personnages plus grands que 8 bits.

Upd2: Mais sizeof résultat n'est PAS un OCTETS ! il est de la taille d'un CHAR. Et le char 2 octets, ou (peut-être) sur 7 bits?

Oui, c'est d'octets. Permettez-moi de dire encore une fois. 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 la même chose que ce que le compilateur C appelle un octet. Le nombre de bits dans un C octet qui varie en fonction de votre architecture de la machine. C'est aussi la garantie d'au moins 8.

15voto

osgx Points 28675

PDP-10 et PDP-11 a été.

Mise à jour: il y a comme pas de C99 de compilateurs pour PDP-10.

Certains modèles d'Appareils Analogiques 32 bits SHARC DSP ont CHAR_BIT=32, et Texas Instruments DSP de TMS32F28xx ont CHAR_BIT=16, apparemment.

Mise à jour: Il y a de GCC 3.2 pour PDP-10 avec CHAR_BIT=9 (cochez la case inclure/limites.h dans cette archive).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X