63 votes

Le caractère est-il garanti d'être exactement 8 bits?

C'est tout. Je n'ai pas trouvé de sujet similaire, alors supportez-le moi.

52voto

Paul Dixon Points 122033

À partir d' une copie de la norme ANSI C les spécifications, voir la Section 3.1.2.5 - Types:

Un objet déclaré comme étant de type char est assez grand pour stocker tous les membres de l'exécution de base jeu de caractères. Si un membre de la source jeu de caractères énumérés dans $2.2.1 est stockée dans un char de l'objet, sa valeur est la garantie d'être positif. Si d'autres les quantités sont stockées dans un char l'objet, le comportement est la mise en œuvre définie: les valeurs sont traité soit signé ou des entiers non négatifs.

Le concept de "l'exécution de caractères" est introduit dans la Section 2.2.1 - les jeux de Caractères.

En d'autres termes, un char doit être au moins assez grande pour contenir un codage d'au moins 95 différents personnages qui composent la base de l'exécution de jeu de caractères.

Maintenant, ajoutez à cela la section 2.2.4.2 - limites Numériques

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

Les tailles des types intégraux

Les valeurs données ci-dessous doivent être remplacé par des expressions constantes adapté pour une utilisation dans #si prétraitement les directives. Leur la mise en œuvre des valeurs définies par l'est égale ou de plus grande ampleur (valeur absolue) à celles indiquées, avec le même signe.

  • nombre maximum de bits pour les plus petits objet qui n'est pas un peu de champ (byte)
    CHAR_BIT 8

  • valeur minimale pour un objet de type signed char
    SCHAR_MIN -127

  • le maximum de valeur pour un objet de type signed char
    SCHAR_MAX +127

  • le maximum de valeur pour un objet de type unsigned char
    UCHAR_MAX 255

....

Donc là vous l'avez: c'est le nombre de bits dans un char doit être d'au moins 8.

11voto

dfa Points 54490

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

8voto

Bastien Léonard Points 18404

Le brouillon standard C99 indique qu’un octet doit avoir une largeur minimale de 8 bits, car <limits.h> contient une macro CHAR_BIT qui donne le nombre de bits par octet et dont la garantie est garantie. au moins 8 (§5.2.4.2.1).

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

3voto

Norswap Points 1264

Nous allons voir exactement ce que dit la norme :

5.2.4.2.1 Tailles des types d'entiers
...
Leur mise en œuvre-la définition des valeurs doit être égale ou de plus grande ampleur (valeur absolue) à celles indiquées, avec le même signe.


nombre de bits pour les plus petits objet qui n'est pas un bits (octet)
CHAR_BIT 8

Cela nous indique qu'un octet est d'au moins 8 bits (dans le paragraphe précédents

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 est égal à 2^CHAR_BIT - 1


Pour chaque entier signé de types, il y a un correspondant (mais différents) type entier non signé (désigné par le mot-clé unsigned) qui utilise la même quantité de stockage (y compris les informations sur les panneaux) et a les mêmes exigences alignement.


Pour un entier non signé de types autres que unsigned char,les bits de l'objet la représentation doit être divisés en deux groupes: la valeur des bits et bits de padding (il y a un besoin ne pas être l'un de ces derniers).

Ces passages nous dire que :

  • un unsigned char doit représenter 2^CHAR_BIT-1 valeurs, ce qui peut être codé sur minimum CHAR_BIT bits (selon la classique représentation binaire, ce qui est prescrit par la norme)
  • un unsigned char ne pas contenir toutes les autres (rembourrage) bits
  • un signed char prend exactement la même place qu'un unsigned char
  • un char est implémenté de la même manière que soit signé ou unsigned char

Conclusion : un char et des variantes unsigned char et char signé sont garantis d'être exactement un octet de la taille, et un octet est assuré d'être au moins 8 bits de large.

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

Sauf pour peu que les champs, les objets sont composé de séquences contiguës de un ou plusieurs octets, l' numéro de la commande,et l'encodage sont soit explicitement spécifié ou la mise en œuvre définies.


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


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


Lorsqu'il est appliqué à un opérande qui est de type char, unsigned char,ou signed char, (ou d'une version de celui-ci), le résultat est 1. Lorsqu'il est appliqué à un opérande qui a de la matrice de type, le résultat est le nombre total d'octets dans le tableau. 88) Lorsqu'il est appliqué à un opérande qui a la structure ou le type d'union, le résultat est le nombre total d'octets dans un tel objet, y compris à l'intérieur et le remplissage à droite.

(À noter qu'il existe une ambiguïté ici. Le sizeof(char) ont la priorité sur les sizeof(type) de la règle ou qu'il ne donne simplement un exemple ?)

Encore, il y a un problème de gauche pour attaquer. Quel est exactement un octet ? Selon la norme, il est "le plus petit objet, qui n'est pas un peu de terrain". Notez que cette théorie peut ne pas correspondre à une machine d'octets, et qu'il y a aussi de l'ambiguïté de ce qu'on appelle une "machine " octet" : il pourrait quels que soient les constructeurs se réfère en tant que "octet", sachant que chaque constructeur peut avoir une définition différente de "octets"; ou une définition générale comme "une séquence de bits qu'un ordinateur, dans les unités individuelles" ou "la plus petite adressable bloc de données".

Par exemple, une machine qui ont 7 bits octets, pour la mise en œuvre d'un "C byte" en tant que deux machine octets.

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

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