43 votes

En C, pourquoi sizeof(char) est-il égal à 1, alors que 'a' est un int ?

J'ai essayé

printf("%d, %d\n", sizeof(char), sizeof('c'));

et a obtenu 1, 4 comme sortie. Si la taille d'un caractère est égale à un, pourquoi est-ce que 'c' me donner 4 ? Je suppose que c'est parce que c'est un nombre entier. Donc quand je fais char ch = 'c'; Y a-t-il une conversion implicite, sous le capot, de cette valeur de 4 octets en une valeur de 1 octet lorsqu'elle est assignée à la variable char ?

3 votes

Je pense que c'est lié à la promotion automatique des nombres entiers. Quelqu'un qui a plus de faits que de croyances postera une réponse factuelle.

2 votes

@Roger : Il demande la différence entre C et C++ sizeof('a'), alors que j'ai demandé s'il y avait une conversion ? Voir le corps de la question. J'ai déjà déduit que 'a' est un entier en C.

0 votes

Je dois remercier "David Rodríguez - dribeas" pour avoir signalé que le lien dans ma réponse est incorrect. Je supprime ma réponse. legends2k, la bonne réponse devrait aller à Peter ou Neil, à mon humble avis.

35voto

Richard Pennington Points 12912

En C, 'a' est une constante entière ( !?!), donc 4 est correct pour votre architecture. Il est implicitement converti en char pour l'affectation. sizeof(char) est toujours 1 par définition. La norme ne dit pas quelle unité est 1, mais il s'agit souvent d'octets.

15 votes

+ 1 pour "mais c'est souvent des octets", je suis encore en train de glousser :)

0 votes

Autrefois, un nombre entier était de 2 octets. La norme ne le définit pas non plus.

0 votes

Puis-je connaître la raison d'être de cette norme qui indique sizeof(char) devrait toujours être égal à 1 ? Est-ce parce que la table ASCII comporte 256 caractères ? Que se passe-t-il si, dans une implémentation, j'ai besoin d'en avoir plus que cela, par exemple l'unicode ?

7voto

La norme C stipule qu'un caractère littéral comme 'a' est de type int, et non de type char. Il a donc (sur votre plate-forme) sizeof == 4. Voir cette question pour une discussion plus approfondie.

5voto

Laurent Etiemble Points 17360

C'est le comportement normal de la sizeof (Voir Wikipedia ) :

  • Pour un type de données, sizeof renvoie la taille du type de données. Pour char vous obtenez 1.
  • Pour une expression, sizeof renvoie la taille du type de la variable ou de l'expression. Comme un littéral de caractère est typé comme int vous obtenez 4.

4voto

paxdiablo Points 341644

Ce point est couvert par la norme ISO C11 6.4.4.4 Character constants bien qu'elle soit largement inchangée par rapport aux normes antérieures. Cela indique, au paragraphe /10 :

Une constante de caractère entier a le type int. T contenant un caractère unique qui correspond à un caractère d'exécution sur un seul octet est la valeur numérique de la représentation du caractère mappé interprétée comme un nombre entier.

0 votes

+1 merci de citer la norme ; je me demande pourquoi constante de caractères entiers a été préféré à constante de caractère .

0voto

t0mm13b Points 21031

Selon les normes ANSI C, un char est promu à un poste de int dans le contexte où les nombres entiers sont utilisés, vous avez utilisé un spécificateur de format de nombre entier dans la balise printf d'où les différentes valeurs. Un char correspond généralement à un octet, mais cette valeur est définie par l'implémentation en fonction du runtime et du compilateur.

5 votes

Le format entier fait référence à sizeof('a') et non à 'a', donc je ne vois pas comment cet argument tient la route.

1 votes

Selon la norme C, un littéral char est de type int - il a sizeof int et aucune promotion n'est impliquée.

1 votes

Votre réponse semble suggérer que le compilateur C inspecte une chaîne de format utilisée par une fonction de bibliothèque lors de la compilation d'un programme, êtes-vous sûr que c'est le cas ?

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