Почему char — 1 байт, а символьный литерал (‘A’) — 4?

char тип данных в языке программирования C является базовым типом, который представляет символ. В большинстве реализаций C размер char составляет 1 байт (8 бит). Это означает, что char может хранить 2^8 или 256 различных значений.

Символьный литерал, как 'A', имеет тип int, а не char. Поэтому его размер составляет обычно 4 байта (32 бита). Это объясняется тем, что символьные литералы в C сохраняются в виде кодовых точек Юникода, которые требуют больше памяти для представления, чем просто ASCII символы.

В Юникоде каждому символу назначается уникальный кодовый номер. И кодовые точки Юникода могут иметь значения от 0 до 0x10FFFF (примерно 1,114,112 различных символов). Чтобы представить этот широкий диапазон символов, символьные литералы в С хранятся в виде 32-битных int значений.

Таким образом, символьные литералы занимают более 1 байта памяти, потому что они должны быть достаточно большими, чтобы представить широкий диапазон символов, включая некоторые не-ASCII символы, такие как символы из различных языков, математические символы, знаки пунктуации и т.д.

Однако, в C предусмотрена возможность использовать явное преобразование (cast) для присваивания символьного литерала переменной типа char, если вам нужно использовать только ASCII символы. Например:

char letter = (char)'A';

Это приведение типа позволяет сохранять символ 'A' в однобайтовой переменной типа char.

В итоге, размер char равен 1 байту, а символьные литералы могут занимать 4 байта из-за представления их в виде 32-битных int значений для поддержки широкого диапазона символов.