В C, почему sizeof (char) 1, когда ‘a’ является int?

Я пытался

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

и получил 1, 4 в качестве выхода. Если размер персонажа один, почему 'c' дает мне 4? Я думаю, это потому, что это целое число. Поэтому, когда я делаю char ch = 'c'; существует ли неявное преобразование, находящееся под капотом, от этого 4 байтового значения до 1 байтового значения, когда оно назначено переменной char?

В C ‘a’ – целочисленная константа (!?!), Поэтому 4 является правильной для вашей архитектуры. Он неявно преобразуется в char для назначения. sizeof (char) всегда по определению. В стандарте не указано, что такое единицы 1, но это часто байты.

В стандарте «С» говорится, что символьный литерал типа «a» имеет тип int, а не тип char. Поэтому он имеет (на вашей платформе) sizeof == 4. См. Этот вопрос для более полного обсуждения.

Это нормальное поведение оператора sizeof (см. Википедию ):

  • Для типа данных sizeof возвращает размер типа данных. Для char вы получаете 1.
  • Для выражения sizeof возвращает размер типа переменной или выражения. Поскольку символьный литерал вводится как int , вы получаете 4.

Это 6.4.4.4 Character constants в ISO C11 6.4.4.4 Character constants хотя в основном они не изменились по сравнению с более ранними стандартами. В пункте /10 говорится:

Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы, содержащей один символ, который сопоставляется однобайтовому символу выполнения, представляет собой числовое значение представления отображаемого символа, интерпретируемого как целое число.

Согласно стандарту ANSI C, char получает статус int в контексте, где используются целые числа, вы использовали спецификатор целочисленного формата в printf следовательно, разные значения. Символ обычно составляет 1 байт, но это реализация определяется на основе среды выполнения и компилятора.

Interesting Posts
Давайте будем гением компьютера.