Я всегда понимал это так: цель класса iostream
состоит в том, чтобы читать и / или записывать поток символов, которые, если вы об этом думаете, являются абстрактными сущностями, которые представлены только компьютером, использующим кодировка символов. Стандарт C ++ прилагает большие усилия, чтобы избежать закрепления кодировки символов, говоря только о том, что «объекты, объявленные как символы (char
), должны быть достаточно большими, чтобы хранить любой элемент базового набора символов реализации», потому что ему не нужно заставить "базовый набор символов реализации" определять язык C ++; стандарт может оставить решение , какое кодирование символов используется для реализации (компилятор вместе с реализацией STL), и просто отметить, что char
объекты представляют отдельные символы в некоторой кодировке.
Автор реализации может выбрать однооктетную кодировку, такую как ISO-8859-1 или даже двухоктетную кодировку, такую как UCS-2 . Это не важно Пока объект char
«достаточно большой, чтобы хранить любой элемент базового набора символов реализации» (обратите внимание, что это явно запрещает кодировки переменной длины ), тогда реализация может даже выбрать кодировку, которая представляет базовую латиницу таким образом, который несовместим с любой обычной кодировкой!
Заблуждение вызывает то, что типы char
, signed char
и unsigned char
имеют в своих именах "char", но важно помнить, что char
не принадлежит к тому же семейству фундаментальных типы как signed char
и unsigned char
. signed char
входит в семейство целочисленных типов со знаком:
Существует четыре целочисленных типа со знаком : "знаковый символ", "короткое целое", "int" и "длинное целое".
и unsigned char
входят в семейство целочисленных типов без знака:
Для каждого из целочисленных типов со знаком существует соответствующий (но различный) целочисленный тип без знака : "unsigned char", "unsigned short int", "unsigned int" и "unsigned long int , "...
Единственное сходство между типами char
, signed char
и unsigned char
заключается в том, что «[они] занимают одинаковое количество памяти и имеют одинаковые требования к выравниванию». Таким образом, вы можете reinterpret_cast
от char *
до unsigned char *
, чтобы определить числовое значение символа в наборе символов выполнения.
Чтобы ответить на ваш вопрос, причина, по которой STL использует char
в качестве типа по умолчанию, заключается в том, что стандартные потоки предназначены для чтения и / или записи потоков символов, представленных char
объектами, а не целыми числами (signed char
и unsigned char
). Использование char
в сравнении с числовым значением является способом разделения проблем.