Подтвердить что ты не робот

Разница между char и int при объявлении символа

Я только начал изучать C и довольно запутался в объявлении символов с помощью int и char.

Мне хорошо известно, что любые символы состоят из целых чисел в том смысле, что "целые числа" символов являются соответствующими символами ASCII.

Тем не менее, я узнал, что вполне возможно объявить символ с помощью int без использования десятичных знаков ASCII. Например. объявление переменной test в качестве символа 'X' может быть записано как:

char test = 'X';

и

int test = 'X';

И для объявления символа символы преобразования %c (хотя тест определяется как int).

Следовательно, мой вопрос:/есть разница между объявлением символьных переменных с помощью char и int и когда использовать int для объявления символьной переменной?

4b9b3361

Ответ 1

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

A char требуется принять все значения от 0 до 127 (включены). Таким образом, в обычных условиях он точно один байт (8 бит). Он не определен стандартом, подписан ли он (-128 - 127) или без знака (0 - 255).

Предполагается, что int должно быть как минимум 16-битным подписанным словом и принимать все значения между -32767 и 32767. Это означает, что int может принимать все значения из char, быть последним подписанным или беззнаковым.

Если вы хотите хранить только символы в переменной, вы должны объявить ее как char. Использование int просто потеряло бы память и могло ввести в заблуждение будущего читателя. Одним из распространенных исключений для этого правила является то, что вы хотите обработать более широкое значение для особых условий. Например, функция fgetc из стандартной библиотеки объявляется как возвращающая int:

int fgetc(FILE *fd);

потому что специальное значение EOF (для End of File) определяется как значение int -1 (все биты в единицу в системе с двумя дополнениями), что означает больше, чем размер char. Таким образом, no char (всего 8 бит в общей системе) может быть равно константе EOF. Если функция была объявлена ​​для возврата простого char, ничто не могло отличить значение EOF от (действительного) char 0xFF.

Это причина, по которой следующий код является плохим и никогда не должен использоваться:

char c;    // a terrible memory saving...
...
while ((c = fgetc(stdin)) != EOF) {   // NEVER WRITE THAT!!!
    ...
}

Внутри цикла достаточно char, но для проверки не получится при чтении символа 0xFF, переменная должна быть int.

Ответ 2

Тип char имеет несколько ролей.

Во-первых, это просто часть цепочки целочисленных типов char, short, int, long и т.д., поэтому это просто еще один контейнер для чисел.

Во-вторых, его базовое хранилище - это наименьшая единица, а все остальные объекты имеют размер, который кратен размеру char (sizeof возвращает число, которое находится в единицах char, поэтому sizeof char == 1).

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

Ответ 3

Обычно вы должны объявлять символы как char и использовать int для целых чисел, способных удерживать большие значения. В большинстве систем char занимает байт, который равен 8 бит. В зависимости от вашей системы этот char может быть подписан или неподписанным по умолчанию, поэтому он сможет удерживать значения между 0-255 или -128-127.

int может быть длиной 32 бита, но если вы действительно хотите точно 32 бита для своего целого числа, вы должны объявить его как int32_t или uint32_t.

Ответ 4

Размер int составляет 4 байта на большинстве архитектур, а размер a char - 1 байт.

Ответ 5

Я думаю, что нет никакой разницы, но вы выделяете дополнительную память, которую вы не собираетесь использовать. Вы также можете сделать const long a = 1;, но лучше использовать const char a = 1;.