OVH Cloud OVH Cloud

Taille d'un char en C

33 réponses
Avatar
Jean
Bonjour,

Il me semblait avoir lu sur ce NG que la taille
d'un char en C valait 1 (sans autre précision sur l'unité) et
que cette taille pouvait être 7, 8 ou plus bits.
J'ai téléchargé la norme ISO/IEC 9899:1999 du langage C
mais je n'ai rien trouvé sur cela.
Pour ceux qui auraient également la norme, pouvez-vous
me dire à quel paragraphe je peux trouver cette info ?
Merci d'avance.
Jean

10 réponses

1 2 3 4
Avatar
Éric Lévénez
Le 9/07/03 17:55, dans <3f0c3ae3$0$4623$, « Jean »
<no_spam> a écrit :

Il me semblait avoir lu sur ce NG que la taille
d'un char en C valait 1 (sans autre précision sur l'unité) et


Par définition sizeof(char) vaut 1 ($6.5.3.4 paragraphe 3), c'est la
définition de l'unité de mesure de sizeof (§6.5.3.4 paragraphe 2). La norme
dit que cette unité de mesure est appelée un "byte" (§3.6)

que cette taille pouvait être 7, 8 ou plus bits.


La taille est >= 8 car il faut pouvoir y caser -127 à +127 (§5.2.4.2.1).

J'ai téléchargé la norme ISO/IEC 9899:1999 du langage C
mais je n'ai rien trouvé sur cela.
Pour ceux qui auraient également la norme, pouvez-vous
me dire à quel paragraphe je peux trouver cette info ?


--
Éric Lévénez -- <http://www.levenez.com>
Unix is not only an OS, it's a way of life.

Avatar
Benoit Dejean
Le Wed, 09 Jul 2003 18:20:27 +0200, Nicolas Favre-Félix a écrit :

Il me semblait avoir lu sur ce NG que la taille d'un char en C valait 1
(sans autre précision sur l'unité)


La fonction sizeof(char) renvoie en effet 1.
oui


L'unité est l'octet.
non


un char est codé sur 1 octet, soit 8 bits.
1 octet fait bien huit bit. cela dit un char est codé sur CHAR_BIT qui

est
=8

Il en est de même pour un unsigned char, mais les bits sont
interpretés différements.
il me semble que le fait que tes char soit signé ou pas dépend de ton

système

--
"Ne perdez pas de vue qu'un programme rapide et incorrect est d'une utilité presque nulle."
Ce qui est loin d'être incompatible avec la notion d'Art.


Avatar
Nicolas Favre-Félix
byte = octet en français

La taille est >= 8 car il faut pouvoir y caser -127 à +127
La taille est d'exactement 8 octets quel que soit le compilateur ou le

système. D'autre part, on peut y stocker des valeurs de -128 à +127 , soit
256 valeurs.
Or 256 = 2^8. CQFD.

pour un unsigned char, les valeurs sont 0 à 255.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Jean" <no_spam> wrote:

Il me semblait avoir lu sur ce NG que la taille
d'un char en C valait 1 (sans autre précision sur l'unité) et


Oui, 1 byte.

que cette taille pouvait être 7, 8 ou plus bits.


8 minimum.

J'ai téléchargé la norme ISO/IEC 9899:1999 du langage C
mais je n'ai rien trouvé sur cela.


Tu ne nous crois pas? Tu as raison. Il faut tout vérifier.

définition de CHAR_BIT?

Pour ceux qui auraient également la norme, pouvez-vous
me dire à quel paragraphe je peux trouver cette info ?


Je fouille la n869 (dernier draft C9x)

5.2.4.2 Numerical limits

1 A conforming implementation shall document all the limits specified in
this subclause, which are specified in the headers <limits.h> and
<float.h>. Additional limits are specified in <stdint.h>.

5.2.4.2.1 Sizes of integer types <limits.h>
1 The values given below shall be replaced by constant expressions
suitable for use in #if preprocessing directives. Moreover, except for
CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions
that have the same type as would an expression that is an object of the
corresponding type converted according to the integer promotions. Their
implementation-defined values shall be equal or greater in magnitude
(absolute value) to those shown, with the same sign.

— number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Nicolas Favre-Félix"
wrote:

byte = octet en français

La taille est >= 8 car il faut pouvoir y caser -127 à +127
La taille est d'exactement 8 octets quel que soit le compilateur ou le

système.


Non. Elle est bien >= 8 bits comme l'a indiqué Eric. Sur un DSP 56156
Motorola, l'adressage minimum est de 32 bits. Un char fait donc 32 bits. Mais
ça n'a aucune importance (à part la désagréable impression de gacher de la
place...) Idem avec les DSP TMS320C54 de Texas (16-bits)

D'autre part, on peut y stocker des valeurs de -128 à +127 , soit


Le minimum requis est -127 à +127. Attention à ne pas confondre ton
implémentation avec la norme.

256 valeurs.
Or 256 = 2^8. CQFD.

pour un unsigned char, les valeurs sont 0 à 255.


Seul ce cas permet de valider l'opération. En signé, il peut y avoir du
complément à 1, à 2 ou signe + magnitude.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Nicolas Favre-Félix"
wrote:

les char sont codés sur CHAR_BIT qui vaut au minimum 8.


Citez moi UNE SEULE plateforme qui a des chars de plus de 8 bits.


Texas TMS320C54 : 16-bit
Motorola 56156 : 32-bit

Tous les codes C manipulant des bits seraient alors incompatibles...


Non, pourquoi?

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Nicolas Favre-Félix
"Emmanuel Delahaye" a écrit dans le message de news:
Non. Elle est bien >= 8 bits comme l'a indiqué Eric. Sur un DSP 56156
Motorola, l'adressage minimum est de 32 bits. Un char fait donc 32 bits.
Mais

ça n'a aucune importance (à part la désagréable impression de gacher de la
place...) Idem avec les DSP TMS320C54 de Texas (16-bits)


Mais alors le codage/décodage de données n'est plus compatible? Comment font
les compilateurs? Si le programmeur a prévu un tableau de 4 char (donc 4*32
bits à la compilation) et qu'il fait des masques et des décalages pour
mettre les 4 à la suite dans une variable de 32 bits (je pense notamment au
codage des adresses IP), il y aura forcément des erreurs...

Dans quoi sont utilisés ces processeurs?

Avatar
Benoit Dejean
Le Wed, 09 Jul 2003 18:50:05 +0200, Nicolas Favre-Félix a écrit :



Quand à la
signitude ( ??? ) d'un char, il me semble que cela est dépendant de ta
plate-forme. d'ailleurs ton compilateur a certainement une option pour
modifier ceci


Sur la plupart des plateformes, les signed char sont codés en

complément vrai (ou complément à deux).
Pour passer d'un nombre positif au même nombre négatif, il suffit
d'inverser tous les bits et d'ajouter 1.


ça me fait une belle jambe.
la norme ne dit rien à ce sujet il me semble.

les char sont codés sur CHAR_BIT qui vaut au minimum 8.


Citez moi UNE SEULE plateforme qui a des chars de plus de 8 bits. Tous
les codes C manipulant des bits seraient alors incompatibles...


tous les codes C qui manipulent des bits ont un problème de portabilité
par définition. lis les réponses de ED. cela dit, la norme garantit 8
bits.

--
"Ne perdez pas de vue qu'un programme rapide et incorrect est d'une utilité presque nulle."
Ce qui est loin d'être incompatible avec la notion d'Art.


Avatar
Richard Delorme
Nicolas Favre-Félix a écrit:

Citez moi UNE SEULE plateforme qui a des chars de plus de 8 bits.
Tous les codes C manipulant des bits seraient alors incompatibles...


PDP-10, où un char vaut 9 bits :

http://pdp10.nocrew.org/gcc/

--
Richard

Avatar
Jean
d'un char en C valait 1 (sans autre précision sur l'unité) et


Oui, 1 byte.


Byte au sens anglosaxon du terme, soit une succession de
bits traités comme un tout ?

Tu ne nous crois pas?


Ce n'est pas ce que j'ai dit.

Tu as raison. Il faut tout vérifier.


Je pense que lire la norme peut être interessant.
Jean


1 2 3 4