Ваш код не печатается 5
, потому что вы не даете его 5
. Вы даете это 5.2
. 5
является целочисленным значением, а 5.2
является значением с плавающей запятой. Первый типично кодируется с использованием дополнения 2s, а второй обычно кодируется с использованием значений с плавающей запятой IEEE. (Существуют и другие возможные и даже иногда используемые кодировки, но две, с которыми вы, скорее всего, столкнетесь, это две, которые я упомянул.)
Если вы сообщаете компьютеру, что задаете ему целое число (%d
), а затем переходите к присвоению ему значения с плавающей запятой (5.2
), получение мусора - это то, что вы ожидаете. Он берет биты представления IEEE с плавающей запятой и читает их, как если бы это было целое число. (Это старая формула: мусор входит, мусор выходит.) Если вы попытаетесь не лгать компьютеру, вы получите лучшие результаты.
Код, который вы хотите использовать в своем вызове printf
: %f
вместо %d
. Использование этого означает, что вы больше не врете компьютеру о типе передаваемых данных. При этом, чтобы избежать неизбежного следующего вопроса, обязательно прочитайте это объяснение с плавающей запятой , поэтому вы понимаете, почему ваши числа с плавающей запятой не такие, как вы думаете.