web-dev-qa-db-fra.com

Est-ce que char est exactement 8 bits de long?

C'est tout. Je n'ai trouvé aucun sujet similaire, alors restez avec moi.

59
Ori Popowski

De ne copie de la spécification C ANSI , voir Section 3.1.2.5 - Types:

Un objet déclaré comme type char est suffisamment grand pour stocker n'importe quel membre du jeu de caractères d'exécution de base. Si un membre du jeu de caractères source requis énuméré dans $ 2.2.1 est stocké dans un objet char, sa valeur est garantie positive. Si d'autres quantités sont stockées dans un objet char, le comportement est défini par l'implémentation: les valeurs sont traitées comme des entiers signés ou non négatifs.

Le concept de "jeu de caractères d'exécution" est introduit dans Section 2.2.1 - Jeux de caractères.

En d'autres termes, un caractère doit être au moins suffisamment grand pour contenir un codage d'au moins les 95 caractères différents qui composent le jeu de caractères d'exécution de base.

Ajoutez maintenant à cela la section 2.2.4.2 - Limites numériques

Une mise en œuvre conforme doit documenter toutes les limites spécifiées dans cette section, qui doivent être spécifiées dans les en-têtes <limits.h> et <float.h>.

Tailles des types intégraux

Les valeurs indiquées ci-dessous doivent être remplacées par des expressions constantes utilisables dans les directives de prétraitement #if. Leurs valeurs définies par l'implémentation doivent être de magnitude égale ou supérieure (valeur absolue) à celles indiquées, avec le même signe.

  • nombre maximum 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 signé char
    SCHAR_MIN -127

  • valeur maximale pour un objet de type signé char
    SCHAR_MAX +127

  • valeur maximale pour un objet de type char non signé
    UCHAR_MAX 255

....

Donc, vous l'avez - le nombre de bits dans un caractère doit être au moins 8.

47
Paul Dixon

Non, il n'est pas garanti d'être 8 bits. sizeof (char) est garanti égal à 1, mais cela ne signifie pas nécessairement un octet de 8 bits.

12
anon

non, le type de données char doit contenir au moins 8 bits (voir spécification ANSI C)

11
dfa

Le projet standard C99 dit qu'un octet doit avoir une largeur d'au moins 8 bits, car <limits.h> contient une macro CHAR_BIT qui donne le nombre de bits par octet et qui est garanti d'être au moins 8 (§5.2.4.2.1).

Le brouillon standard C++ inclut les C's <limits.h> sous le nom <climits> (§18.2.2).

7
Bastien Léonard

Voyons exactement ce que dit la norme:

5.2.4.2.1 Tailles des types entiers
...
Leurs valeurs définies par la mise en œuvre doivent être de magnitude égale ou supérieure (valeur absolue) à 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

Cela nous dit qu'un octet est au moins 8 bits (le paragraphe juste au-dessus

Si la valeur d'un objet de type char est traitée comme un entier signé lorsqu'elle est utilisée 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 doit être égale à 2 ^ CHAR_BIT - 1


Pour chacun des types d'entiers signés, il existe un type d'entier non signé correspondant (mais différent) (désigné par le mot-clé unsigned) qui utilise la même quantité de stockage (y compris les informations de signe) et a les mêmes exigences d'alignement.


Pour les types entiers non signés autres que le caractère non signé, les bits de la représentation d'objet doivent être divisés en deux groupes: les bits de valeur et les bits de remplissage (il n'est pas nécessaire qu'il y en ait un).

Ces passages nous disent que:

  • un caractère non signé doit représenter 2 ^ valeurs CHAR_BIT-1, qui peuvent être codées sur des bits CHAR_BIT minimum (selon la représentation binaire conventionnelle, qui est prescrite par la norme)
  • un caractère non signé ne contient aucun bit (de remplissage) supplémentaire
  • un caractère signé prend exactement le même espace qu'un caractère non signé
  • un caractère est implémenté de la même manière que le caractère signé ou non signé

Conclusion: un caractère et ses variantes caractère non signé et caractère signé sont garantis pour avoir exactement un octet de taille, et un octet est garanti pour avoir au moins 8 bits de large.

Maintenant, ce sont d'autres indications (mais pas une preuve formelle comme ci-dessus) qu'un char est en effet un octet:

A l'exception des champs binaires, les objets sont composés de séquences contiguës d'un ou plusieurs octets, dont le nombre, l'ordre et le codage sont soit explicitement spécifiés, soit définis par l'implémentation.


Les valeurs stockées dans des objets hors champ de bits de tout autre type d'objet sont constituées de n × CHAR_BIT bits, où n est la taille d'un objet de ce type, en octets. La valeur peut être copiée dans un objet de type unsigned char [n]


L'opérateur sizeof donne la taille (en octets) de son opérande, qui peut être une expression ou le nom entre parenthèses d'un type. La taille est déterminée à partir du type de l'opérande. Le résultat est un entier. Si le type de l'opérande est un type de tableau de longueur variable, l'opérande est évalué; sinon, l'opérande n'est pas évalué et le résultat est une constante entière.


Lorsqu'il est appliqué à un opérande de type char, de caractère non signé ou de caractère signé (ou à une version qualifiée de celui-ci), le résultat est 1. Lorsqu'il est appliqué à un opérande de type tableau, le résultat est le nombre total d'octets dans le tableau . 88) Lorsqu'il est appliqué à un opérande qui a une structure ou un type d'union, le résultat est le nombre total d'octets dans un tel objet, y compris le remplissage interne et final.

(Notez qu'il y a une ambiguïté ici. La taille de (char) remplace-t-elle ici la règle sizeof (type) ou donne-t-elle simplement un exemple?)

Pourtant, il reste un problème à résoudre. Qu'est-ce qu'un octet exactement? Selon la norme, c'est "le plus petit objet qui n'est pas un champ binaire". Notez que cela peut théoriquement ne pas correspondre à un octet machine , et qu'il existe également une ambiguïté quant à ce que l'on appelle un "octet machine": cela pourrait tout ce que les constructeurs appellent "octet", sachant que chaque constructeur peut avoir une définition différente de "octet"; ou une définition générale comme "une séquence de bits qu'un ordinateur traite en unités individuelles" ou "le plus petit bloc de données adressable".

Par exemple, une machine qui a des octets de 7 bits, devrait implémenter un "octet C" comme deux octets de machine.

Source de toutes les citations: Projet de comité - 7 septembre 2007 ISO/IEC 9899: TC .

3
Norswap

De la norme C décrivant les limites.h (un certain reformatage est nécessaire):

  1. nombre de bits pour le plus petit objet qui n'est pas un champ de bits (octet): CHAR_BIT 8
  2. valeur minimale pour un objet de type signé char: SCHAR_MIN -127
  3. valeur maximale pour un objet de type signé char: SCHAR_MAX +127

CHAR_BIT minimum de 8 garantit qu'un caractère a une largeur d'au moins 8 bits. Les plages sur SCHAR_MIN et SCHAR_MAX garantissent que la représentation d'un caractère signé utilise au moins huit bits.

1
dek