Символьный тип в языке C++ относится к целочисленным типам, однако запись символов имеет свои отличия.
Для работы с символами в языке C++ предусмотрены символьные типы (signed) char и unsigned char. Первый – это целое число со знаком, хранящееся в одном байте (его диапазон от -128 до 127), второй – беззнаковое однобайтовое число (его диапазон от 0 до 255). Эти типы чаще всего используются для работы с символами, поскольку коды символов как раз помещаются в байт.
Существует несколько стандартов, определяющих соответствие кодов символам. Для букв английского алфавита, цифр, знаков препинания и знаков операций используется стандарт ASCII, который определяет коды от 0 до 127. Для представления русских букв используется стандарты, в которых русские буквы кодируются числами от 128 до 255 (или, соответственно, от -128 до -1). Таким образом, все символы могут быть представлены в одном байте (максимальное число символов, которое можно представить в одном байте – 255). Переменную символьного типа можно объявить так:
char с; // однобайтовое число со знаком
unsigned char u; // однобайтовое число без знака
Для записи символьных констант используются одиночные кавычки (апострофы). Примеры:
'S' '&' '8' 'ф'
Числовым значением символьной константы является код соответствующего символа, принятый в используемой операционной системе.
Поскольку, несмотря на двойственность своей природы, символы – это, прежде всего, целые числа, к ним применимы все операции, определенные для целых чисел. Поэтому вполне допустимо использование символов в выражениях:
'F' + 1
'а' < 23
а также присваивания им числовых значений:
char c = 45;
Символы, отображающие 26 больших (заглавных) букв английского алфавита от 'A' до 'Z' представлены последовательными возрастающими числовыми кодами, причем код символа 'B' больше кода символа 'A' на 1, а код символа 'Z' – на 25. Точно так же упорядочены коды символов, отображающих 26 малых (строчных) английских букв от 'a' до 'z', причем коды малых букв располагаются в таблице позже кодов больших букв. Разница между кодами одинаковых малых и больших букв ('a'-'A') составляет фиксированное значение 32, что в двоичной записи кодов означает наличие единицы в старшем, незнаковом разряде. Упорядочены также и коды символов, отображающих цифры от 0 до 9 (код символа '9' на 9 больше кода символа '0').
В кодировке ASCII два следующих оператора эквивалентны:
char с = 68; // 68 – код буквы D
char с = 'D';
Первый из них инициализирует символьную переменную c числовым значением 68. Второй присваивает этой переменной код латинской буквы D, который в кодировке ASCII равен 68.
Некоторые символы нельзя ввести в программу обычным способом. Это, например, символы, не представленные на клавиатуре или играющие особую роль в записи символов и строк. Для их обозначения используются специальные управляющие символьные константы, так называемые эскейп–последовательности, начинающиеся с обратной дробной черты. Эти последовательности стандартны и предопределены в языке. Вот некоторые из них:
\b возврат на один символ назад
\n новая строка
\r возврат каретки
\t горизонтальная табуляция
\' апостроф
\" двойные кавычки
\\ обратная дробная черта
Символьная константа может быть представлена и с использованием ее числового кода. Для этого ее восьмеричный или шестнадцатеричный (с префиксом 'x') числовой код записывается после обратной дробной черты:
const char zero = '\0'; // инициализация нуль-символом
const unsigned char bitmask = '\xFF';
cout << 'A' << (char)65 << '\101' << '\x41' << endl;// вывод AAAA
Алфавит большинства европейских языков может быть представлен однобайтовыми числами (то есть кодами в диапазоне от 0 до 255). В большинстве кодировок принято, что первые 127 кодов отводятся для символов, входящих в набор ASCII: ряд специальных символов, латинские заглавные и строчные буквы, арабские цифры и знаки препинания. Вторая половина кодов – от 128 до 255 отводится под буквы того или иного языка. Фактически вторая половина кодовой таблицы интерпретируется по-разному, в зависимости от того, какой язык считается "текущим". Один и тот же код в разных кодировках может соответствовать различным знакам или буквам.