如何在C语言中将float值存储到uint64_t类型变量中?
解决float与uint64_t的底层数据转移问题
直接强制转换(uint64_t)val是数值转换,会截断float的小数部分(比如1.5f会被转成整数1),所以转回float后只能得到1.0。要实现底层的二进制数据转移,得直接操作内存里的比特位,有两种可靠方法:
方法1:用memcpy直接复制内存
这是最直接的内存操作方式,把float的二进制字节原样拷贝到uint64_t变量中,反向操作同理:
#include <stdio.h> #include <string.h> int main() { float val = 1.5f; uint64_t var; // 把float的内存内容拷贝到uint64_t memcpy(&var, &val, sizeof(float)); float res; // 把uint64_t的内存内容拷贝回float memcpy(&res, &var, sizeof(float)); printf("%.1f\n", res); // 输出1.5 return 0; }
注意:float一般是4字节,uint64_t是8字节,拷贝只会覆盖uint64_t的低4字节,高4字节的垃圾值不影响转回float的结果——因为转回时只会读取前4字节。
方法2:用联合体(Union)
联合体的所有成员共享同一块内存,通过不同类型成员可以访问同一段二进制数据:
#include <stdio.h> typedef union { float f; uint64_t u64; } FloatUint64Union; int main() { float val = 1.5f; FloatUint64Union u; u.f = val; // 写入float的二进制到内存 uint64_t var = u.u64; // 以uint64_t类型读取同一块内存 FloatUint64Union u2; u2.u64 = var; printf("%.1f\n", u2.f); // 输出1.5 return 0; }
额外说明
- 这两种方法都依赖平台的浮点数存储格式(主流平台都是IEEE 754),如果你的平台不兼容IEEE 754,结果可能异常,但绝大多数现代系统都没问题。
- 你提到的int、char*、bool类型直接强制转换可行,是因为它们的二进制表示可以直接映射到uint64_t:指针本身就是地址值,bool是0/1,int转uint64_t会高位补0,反向转换也不会丢失信息。
内容的提问来源于stack exchange,提问作者Роман
相关产品推荐
相关产品推荐

