Подтвердить что ты не робот

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

Я пробовал

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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