Прежде всего, помните, что двоичные представления значений int
и float
очень отличаются друг от друга.Представления для целочисленного значения 1
и значения с плавающей запятой 1.0
не выглядят ничем похожими друг на друга.Предполагая 32-битное представление int
и float
и IEEE-754, мы получаем:
1: 0000 0000 0000 0000 0000 0000 0000 0001 (0x00000001)
1.0: 0111 1111 1000 0000 0000 0000 0000 0000 (0x3f800000)
Назначение float
значения для int
объекта усечения дробногочасть - если вы напишите что-то вроде
int b = 1.2f; // 0x3f99999a
, значение, хранящееся в b
, будет 1
(0x00000001
).Если вы попытаетесь присвоить b
обратно float
, например
float f = b;
, тогда значение, сохраненное в f
, будет 1.0
(0x3f800000
), , а не 1.2
(0x3f99999a
)
Таким образом, вы не можете сохранить float
значение в int
объекте с помощью простого назначения.
Вы можете сохранить битовая комбинация для значения с плавающей точкой в int
объекте , если , int
, по крайней мере, такой же ширины, как float
, либо с использованием memcpy
, либо некоторымивид литья гимнастики (как показали другие ответы).Однако, если вы попытаетесь напечатать это значение, используя printf
со спецификатором преобразования %d
, вывод не будет представлением этого значения float
(1.2
), это будет представление целое число значение, представленное этой битовой комбинацией (1067030938
).
Не существует безопасного, четко определенного, стандартного способа хранения значения с плавающей запятой значение в целочисленном объекте и обработки его как любого другого объекта с плавающей запятой.C может быть не так строго типизирован, как другие языки, но его достаточно достаточно , так что вам придется полагаться на небезопасные хаки, чтобы обойти его (как было продемонстрировано в других ответах).