Ни в одном из полученных вами ответов не упоминалось о том, что (по крайней мере, IMO) имеет решающее значение.
Когда вы читаете символ, значение читается как unsigned char
и преобразуется оттуда в int
(§7.19.7.1 / 2):
Если индикатор конца файла для входного потока, на который указывает поток, не установлен, и
следующий символ присутствует, функция fgetc получает этот символ как неподписанный
char преобразуется в int и перемещает соответствующий индикатор положения файла для
поток (если определен).
Эта конкретная цитата для fgetc
- getc
, getchar
и fread
- все они необходимы для чтения данных, как если бы они вызывали fgetc
.
Это неявно (по крайней мере, вроде) предполагает, что char
имеет меньший диапазон, чем int
, поэтому преобразование в int
позволяет представить по крайней мере одно значение, которое не могло быть получено из файла , В другом месте стандарт отрицает это как требование, но я думаю, что отказ нереалистичен - я уверен, что реализация с char
и int
одинакового размера нарушит огромное количества кода.