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

 sizeof(char) = 1 байт  

sizeof('A') = 4 байт.  

  

Я понял, что то, что мы называем символами, на самом деле является числовым кодом, а потому символьным литералам выделяется столько же памяти, сколько и типу int (4 байта).  

Но я не совсем понял, как в однобайтный char вмещается четырехбайтный символ?  

И когда я объявляю char test = 'A'; то сколько в компьютере выделилось памяти: 1 байт или 4?  

  

(Если попробовать sizeof(test), то выйдет, что все таки 1. Но ведь 'A' - это 4 байта?) 

 А теперь скажу правильный ответ.  

В Си символьный литерал имеет тип int и потому его sizeof 4 байта.  

В Си++ у него тип char и 1 байт. Потому те, кто создавал CPP-файл, проблемы не видели. Очевидно, связано с перегрузкой функций: как-то не хочется, чтобы в foo('A') вызывалась версия для int.  

```
#include <stdio.h>

int main()
{
    int sz = sizeof('A');  // латинское
    printf("sz = %d\n", sz);
    return 0;
}
```
  

Си: 4  

Си++: 1  

  

При написании `char test='A'` на стеке будет 1 байт (+выравнивание). Здесь Си, грубо говоря, проводит преобразование типа — прямо при компиляции. Если написать `char test=L'Й'`, сообщит, что преобразование при компиляции ushort→char обрежет результат с 1049 до 25. 

> Я понял, что то, что мы называем символами, на самом деле является числовым кодом

  

Все в компьютере хранится в виде бит, сгруппированных по байтам.  

Символ - абстракция для упрощения программирования, и есть различные таблицы кодировки для того, чтобы преобразовывать байты в символы при выводе на экран.  

Количество байт, нужных на символ зависит собственно от кодировки.  

В старых кодировках один байт означал один символ, в современных UTF, количество байт может быть разное (до 6 байт на символ в виде иероглифа).  

  

> а потому символьным литералам выделяется столько же памяти, сколько и типу int (4 байта).

  

Юзай typeid чтобы уточнить тип данных  

  

> Но я не совсем понял, как в однобайтный char вмещается четырехбайтный символ?

  

никак, это не char.  

в С по дефолту char это однобайтный символ в ascII  

  

> И когда я объявляю char test = 'A'; то сколько в компьютере выделилось памяти: 1 байт или 4?

  

Ты же сам указываешь тип при объявлении. Надо было привести код целиком.  

  

(Если попробовать sizeof(test), то выйдет, что все таки 1. Но ведь 'A' - это 4 байта?)  

'A' это значение, а не тип. Может быть это int? 

 А нечего русские буквы в char запихивать  

> In (1), if c-char is not a numeric character sequence and is not representable as a single byte in the execution character set, the character literal is conditionally supported, **has type int and implementation-defined value**.

  

  

[https://en.cppreference.com/w/cpp/language/charact...](https://en.cppreference.com/w/cpp/language/character_literal) 

```
#include <iostream>  
#include <typeinfo>  //for 'typeid' to work  

using namespace std;

int main () {  

    std::cout << typeid('A').name() << std::endl;  
     std::cout << sizeof('A') << std::endl;  
 }
```
  

  

Ответ:  

c  

1  

  

Как у вас 4 байта получилось? 

 ascii