char
- это , а не , которое переводится в int
из-за управляющей строки.char
работает как int, потому что все данные размером менее 4 байт при передаче в printf
увеличиваются до 4 байтов, что является размером int
, из-за соглашения о вызовах cdecl для функций с переменными числами(суть в том, что следующие данные будут выровнены по 4-байтовой границе в стеке).
printf
не является типобезопасным и не знает, какие данные вы действительно передаетеЭто;он слепо считывает управляющую строку и извлекает определенное количество байтов из стека на основе найденных последовательностей и интерпретирует этот набор байтов как тип данных, соответствующий управляющей последовательности.Он не выполняет никаких преобразований, и причина, по которой вы получаете некоторую странную распечатку, состоит в том, что биты int
интерпретируются как биты float
.