Предположим, что ваша платформа имеет восьмибитные байты, и предположим, что у нас есть битовая комбинация 10101010
. Для signed char
это значение равно минус 86. Для unsigned char
, однако, та же самая битовая комбинация представляет 170. Мы не сдвинули биты; это одни и те же биты, интерпретируемые двумя разными способами.
Теперь для char
. Стандарт не говорит, какая из этих двух интерпретаций должна быть правильной. char
с битовой комбинацией 10101010
может быть либо & minus; 86 или 170. Это будет одно из этих двух значений, но вы должны знать компилятор и платформа, прежде чем вы можете предсказать, что это будет. Некоторые компиляторы предлагают переключатель командной строки, чтобы контролировать, какой это будет. Некоторые компиляторы имеют разные значения по умолчанию в зависимости от того, на какой ОС они работают, поэтому они могут соответствовать соглашению об ОС.
В большинстве кодов это действительно не должно иметь значения. Они рассматриваются как три различных типа для целей перегрузки. Указатели на один из этих типов не совместимы с указателями на другой тип. Попробуйте позвонить strlen
с signed char*
или unsigned char*
; это не сработает.
Используйте signed char
, если вы хотите однобайтовый числовой тип со знаком, и используйте unsigned char
, если вы хотите однобайтовый числовой тип без знака. Используйте просто старый char
, когда вы хотите держать символы. Это то, о чем думал программист, когда писал typedef, о котором вы спрашиваете. Имя «байт» не имеет смысла для хранения символьных данных, тогда как имя «unsigned char» имеет в своем названии слово «char», и это заставляет некоторых людей думать, что это хороший тип для хранения символов, или что Рекомендуется сравнить его с переменными типа char
.
Поскольку вы вряд ли будете выполнять общую арифметику для символов, не имеет значения, подписан ли или не подписан char
на любой из используемых вами платформ и компиляторов.