Если я правильно помню, «char» может быть подписанным или неподписанным (это зависит от компилятора / реализации). Если вам нужен неподписанный символ, вы должны явно запросить его (с «беззнаковым символом»), а если вам нужен подписанный символ, вы должны явно попросить его (с «подписанным символом»).
"char" - это просто (обычно 8-битное) целое число. Это не имеет ничего общего с персонажами.
Персонаж может быть чем угодно, в зависимости от того, что вы делаете. Я предпочитаю использовать "uint32_t" и Unicode (UTF-32). Для хрустящего старого / испорченного программного обеспечения, использующего ASCII, отлично подойдет char (независимо от того, подписано или нет значение char). Для UTF-8 вы, вероятно, захотите использовать «unsigned char» или «uint8_t».
Вы также можете попытаться использовать "wchar_t" (и заголовок "wchar.h"), но есть много способов, которые могут пойти не так (проведите некоторое исследование, если вас искушают).