Dans C, pourquoi sizeof (char) 1, quand ‘a est un int?

j’ai essayé

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

et obtenu 1, 4 en sortie. Si la taille d’un personnage est un, pourquoi 'c' me donne 4? Je suppose que c’est parce que c’est un entier. Donc, quand je fais char ch = 'c'; Y a-t-il une conversion implicite qui se produit, sous le capot, de cette valeur de 4 octets à une valeur de 1 octet lorsqu’elle est assignée à la variable char?

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 ce qu’est une unité 1, mais elle est souvent en octets.

Le standard C dit qu’un littéral de caractère comme ‘a’ est de type int, pas de type char. Il a donc (sur votre plate-forme) sizeof == 4. Voir cette question pour une discussion plus complète.

C’est le comportement normal de l’opérateur sizeof (voir Wikipedia ):

  • Pour un type de données, sizeof renvoie la taille du type de données. Pour le 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 tapé comme int , vous obtenez 4.

Ceci est traité dans la norme ISO C11 6.4.4.4 Character constants même si elles sont en grande partie inchangées par rapport aux normes précédentes. Cela dit, au paragraphe /10 :

Une constante de caractère entier a le type int. La valeur d’une constante de caractère entier contenant un seul caractère qui correspond à un caractère d’exécution d’un octet correspond à la valeur numérique de la représentation du caractère mappé interprétée comme un entier.

Selon les normes C ANSI, un caractère est promu dans un int dans le contexte où des entiers sont utilisés, vous avez utilisé un spécificateur de format d’entier dans printf où les différentes valeurs. Un caractère est généralement de 1 octet, mais il s’agit d’une implémentation basée sur le runtime et le compilateur.