Задать вопрос
@Xproz
Пытаюсь постигнуть компьютерные сети

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

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

Я понял, что то, что мы называем символами, на самом деле является числовым кодом, а потому символьным литералам выделяется столько же памяти, сколько и типу int (4 байта).
Но я не совсем понял, как в однобайтный char вмещается четырехбайтный символ?
И когда я объявляю char test = 'A'; то сколько в компьютере выделилось памяти: 1 байт или 4?

(Если попробовать sizeof(test), то выйдет, что все таки 1. Но ведь 'A' - это 4 байта?)
  • Вопрос задан
  • 1033 просмотра
Подписаться 3 Простой 1 комментарий
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
А теперь скажу правильный ответ.
В Си символьный литерал имеет тип 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.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
saboteur_kiev
@saboteur_kiev
software engineer
Я понял, что то, что мы называем символами, на самом деле является числовым кодом

Все в компьютере хранится в виде бит, сгруппированных по байтам.
Символ - абстракция для упрощения программирования, и есть различные таблицы кодировки для того, чтобы преобразовывать байты в символы при выводе на экран.
Количество байт, нужных на символ зависит собственно от кодировки.
В старых кодировках один байт означал один символ, в современных UTF, количество байт может быть разное (до 6 байт на символ в виде иероглифа).

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

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

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

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

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

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

(Если попробовать sizeof(test), то выйдет, что все таки 1. Но ведь 'A' - это 4 байта?)
'A' это значение, а не тип. Может быть это int?
Ответ написан
Комментировать
@galaxy
А нечего русские буквы в 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...
Ответ написан
GavriKos
@GavriKos
#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 байта получилось?
Ответ написан
profesor08
@profesor08
ascii
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы