Когда вы передаете float
в качестве аргумента переменной функции (например, printf()
), она повышается до double
, что в два раза больше float
(по крайней мере на большинстве платформ) .
Один из способов обойти это - привести float
к unsigned int
при передаче его в качестве аргумента printf()
:
printf("hex is %x", *(unsigned int*)&f);
Это также более правильно, поскольку printf()
использует спецификаторы формата для определения размера каждого аргумента.
Технически, это решение нарушает строгое правило алиасинга . Вы можете обойти это, скопировав байты float
в unsigned int
и затем передав его в printf()
:
unsigned int ui;
memcpy(&ui, &f, sizeof (ui));
printf("hex is %x", ui);
Оба эти решения основаны на предположении, что sizeof(int) == sizeof(float)
, что имеет место во многих 32-разрядных системах, но не обязательно.