В Си, почему sizeof (char) 1, когда «a» является int? - PullRequest
42 голосов
/ 12 февраля 2010

Я пытался

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

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

Ответы [ 5 ]

35 голосов
/ 12 февраля 2010

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

7 голосов
/ 12 февраля 2010

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

5 голосов
/ 12 февраля 2010

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

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

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

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

0 голосов
/ 12 февраля 2010

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

...