Это законно. fputc
преобразует свой вход int
в unsigned char
, и это преобразование не может сделать ничего слишком неприятного. Это просто принимает значение по модулю UCHAR_MAX+1
.
Если char
не подписано в вашей реализации, то преобразование из unsigned char
в char
не влияет на значение.
Если в вашей реализации подписано char
, то преобразование значения, большего CHAR_MAX
, в char
либо даст результат, определенный реализацией, либо вызовет сигнал (6.3.1.3/3). Таким образом, хотя ваш код допустим, возможное поведение включает в себя выдачу сигнала, который завершает программу, что может не соответствовать вашему желанию.
На практике вы ожидаете, что реализации будут использовать дополнение 2 и конвертировать в знаковые типы «очевидным» способом, сохраняя битовый шаблон.
Даже если ничего не выйдет из строя, ваш терминал может не сделать ничего разумного, если вы напишите странный байт в STDOUT.