Это может показаться нелогичным, но getc
не возвращает char
- оно возвращает int
. Это сделано для того, чтобы использовать значение вне диапазона для указания конца файла.
Поведение <<
сильно отличается между char
и int
. Для char
он выводит символ, как и следовало ожидать, но для int
он выводит десятичное представление числа.