2010-10-14 2 views
1
char ch = 'a'; 

Здесь ch является символьной переменной, поэтому размер составляет один байт. 'a' является символьной константой, поэтому будет сохранено значение ASCII, которое равно 2 байтам. Но как можно сохранить значение 2 байта в 1 байтовой переменной?Сохранение символьной константы в символьной переменной

+0

Каково значение ASCII 'a' для двух байтов? ASCII - это 7-битный стандарт кодирования символов. – dandan78

+2

Не понимаю. ASCII - это набор из 128 символов, поэтому 7 бит должны быть достаточными для представления всех символов ASCII. – Benoit

+0

Но размер символьной константы составляет 2 байта или 4 байта ... так как можно сохранить его в 1 байтовой переменной? – Parikshita

ответ

3

Литеральный символ, такой как 'a', будет рассматриваться как целочисленный литерал, такой как 97 или 0x61. C, как правило, хотят, чтобы каждое целое число сохранялось в int, если не указано иное, поэтому sizeof('a'), вероятно, будет sizeof(int).

Вы должны заметить, что значение 'a' меньше 127, поэтому его можно хранить в символе (который имеет максимальное значение 127 или 255 в зависимости от того, подписан он или нет в вашем компиляторе) , Это то же самое, как быть в состоянии:

unsigned long long x = 0; 
unsigned int y = x; 

y назначается из x, тип которого больше, чем y «s типа, но x» значение s хорошо в тех, которые y могут представлять собой, поэтому нет данных теряется, когда верхние биты (все 0s) отрубаются.

-2

Ну постоянный характер только один байты ...

+2

Тип символьного литерала на самом деле 'int' в C. – detly

+0

' sizeof ('c') 'возвращает 1 с VS2010 и gcc 4.3 – tibur

+1

Мы говорим о C, а не C++. В C++ 'sizeof ('c')' равно 1. – AndiDog

2

Наряду с другими Своими замечаниями людей более нескольких соответствующей информацию можно найти на сайте this question.

0

Вы задали хороший вопрос. Я предлагаю вам сделать две вещи, чтобы убедиться, что есть достаточно места для хранения персонажа:

1) Посмотрите документацию для getchar(), и вы увидите, что она возвращает int, поэтому есть достаточно места для сохраните значение символа. Хорошо понимать основы декларации, но если вы объявите char cTestChar = 'c';, достаточно места для хранения значения.

2) Сгенерируйте листинг сборки при компиляции. Visual C/C++ поддерживает это, а также gcc. gcc использует параметр -Wa для генерации сборки. На карте будет показано распределение типа символа.

Смежные вопросы