Ответ 1
В C 'a' - целочисленная константа (!?!), поэтому 4 верна для вашей архитектуры. Он неявно преобразован в char для назначения. sizeof (char) всегда по определению. В стандарте не указано, что такое единицы 1, но часто байты.
Я пробовал
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, но часто байты.
В стандарте Th C указано, что символьный литерал типа 'a' имеет тип int, а не тип char. Поэтому он имеет (на вашей платформе) sizeof == 4. См. этот вопрос для более полного обсуждения.
Это нормальное поведение оператора sizeof
(см. Wikipedia):
sizeof
возвращает размер типа данных. Для char
вы получите 1.sizeof
возвращает размер типа переменной или выражения. Поскольку символьный литерал набирается как int
, вы получаете 4.Это описано в ISO C11 6.4.4.4 Character constants
, хотя оно в значительной степени не изменилось по сравнению с более ранними стандартами. Это указывает в пункте /10
:
Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы содержащий один символ, который сопоставляется однобайтовому символу выполнения, является числовое значение представления отображаемого символа, интерпретируемого как целое число.
Согласно стандарту ANSI C, char
получает значение int
в контексте, где используются целые числа, вы использовали спецификатор целочисленного формата в printf
, следовательно, разные значения. A char обычно составляет 1 байт, но это реализация определяется на основе среды выполнения и компилятора.