На самом деле char
, signed char
и unsigned char
- это три разных типа. Из стандарта (ISO / IEC 9899: 1990):
6.1.2.5 Типы
...
Три типа символ , символ со знаком и
беззнаковый символ вместе называются
типы символов .
(а в C ++, например, вы должны (или, по крайней мере, должны) написать переопределяющие функции с тремя их вариантами, если у вас есть аргумент char)
Простой символ может быть обработан компилятором как подписанный или неподписанный, но стандарт гласит (также в 6.1.2.5):
Объект, объявленный как тип char is
достаточно большой, чтобы хранить любой член
основной набор символов выполнения. Если
член требуемого источника
набор символов в 5.2.1 хранится в
char объект, его значение гарантировано
быть позитивным. Если другие количества
хранятся в объекте char ,
поведение определяется реализацией:
значения рассматриваются как
целые числа со знаком или неотрицательные числа.
и
Объект, объявленный как char со знаком типа, занимает тот же объем памяти, что и обычный объект char .
Символами, указанными в п. 5.2.1, являются A-Z, a-z, 0-9, пробел, табуляция, новая строка и следующие 29 графических символов:
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
Ответ
Все это, как я понимаю, означает, что символы ascii со значением меньше 128 гарантированно будут положительными. Поэтому, если сохраненные значения всегда меньше 128, это должно быть безопасно (с точки зрения сохранения значений), хотя и не очень хорошая практика.