You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者Роман

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:45:29