После того, как вы неопределенное поведение, все позволено случиться, так что вы не можете ожидать, ничего толкового после печати с неправильным спецификатором преобразования.
Однако в этом случае мы можем восстановить то, что, вероятно, произошло.
printf
является вариационной функцией, поэтому ее аргументы подвергаются рекламным акциям по умолчанию. Это означает, что аргументы float
рекламируются до double
до их передачи в printf
.
IEEE754 double
представление 5 является
0x4014000000000000
кодирующий знак-бит 0, показатель степени 2 + 1023 = 1025 = 0x401
и мантиссу из 5/4
, который, удаляя скрытые 1 бит становится 0x4000000000000
.
Отпечатанные значения: 0 и 1075052544 = 0x40140000
. Они соответствуют 32-разрядным разрядам double
5 и 32-разрядным номерам высокого порядка соответственно.
Поскольку% d ожидает, что int не является float, используйте% f для поплавков. – hetepeperfan
Ну, как только у вас есть UB, все может случиться. Но знаете ли вы, что 'float' продвигается до 'double', когда передается' printf'? –
их повышают вдвое? как ? пожалуйста, уточните @DanielFischer – akash