В 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 байт, но это реализация определяется на основе среды выполнения и компилятора.

  • Как resize шрифта JLabel, чтобы взять максимальный размер
  • Разница между опциями передачи в aes () и за ее пределами в ggplot2
  • Сколько данных может содержать список максимум?
  • В чем разница между Width и ActualWidth в WPF?
  • увеличить размер кучи java навсегда?
  • Как я могу получить размер файла в C?
  • C # FileStream: оптимальный размер буфера для записи больших файлов?
  • Проверка размера объекта в Objective-C
  • Как определить искусственный смелый стиль, искусственный курсив и искусственный контурный стиль текста с помощью PDFBOX
  • Почему это происходит с оператором sizeof при сравнении с отрицательным числом?
  • C # «Параметр недействителен». Создание нового растрового изображения
  • Давайте будем гением компьютера.