Прежде всего, неправильная строка формата printf()
является неопределенным поведением.Теперь это говорит о том, что на самом деле происходит в вашем случае:
В функциях vararg, таких как printf()
, целые числа, меньшие int
, повышаются до int
, а числа с плавающей точкой меньше double
в double
.
В результате ваш 27.881
преобразуется в 8-байтовый двойной, поскольку он передается в printf()
.Поэтому двоичное представление больше не совпадает с float
.
Строка формата %d
предполагает 4-байтовое целое число.Таким образом, вы будете печатать младшие 4 байта представления двойной точности 27.881
.(предполагая little-endian)
* На самом деле (при условии строгого FP) вы видите нижние 4 байта 27.881
после того, как он приведен к float
, а затем повышен до double
.