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

两种float转十六进制方法的差异及第二种转换机制咨询

浮点数转十六进制的两种方法解析

示例代码

float decimal = 12.1;
int num = (int) decimal;        // <- (方法1)
int num2 = (*(int*) &decimal); //  <- (方法2)

cout << hex << num << "\n";
cout << hex << num2 << "\n";

运行结果

0xc
0x4141999a

问题解答

1. 两种转换方法的区别

  • 方法1:数值截断转换
    这是标准的数值类型转换,直接提取浮点数的整数部分(截断小数位),转换的是浮点数代表的数学数值。12.1的整数部分是12,转十六进制后得到0xc。这种转换会丢失浮点数的小数部分信息,只保留整数的数值含义。
  • 方法2:二进制位直接解读
    这种方式不做任何数值计算,只是把浮点数在内存中的二进制存储内容,直接当作int类型的二进制来读取和解析。得到的结果是该浮点数按照IEEE 754单精度标准存储时对应的十六进制表示,完全保留了浮点数的所有底层存储信息。

2. 第二种方法的转换机制

步骤拆解如下:

  1. &decimal:获取浮点数变量decimal的内存地址,此时指针类型为float*。
  2. (int*) &decimal:将float*类型的指针强制转换为int*类型,告诉编译器:把这个地址指向的内存区域,当作int类型的存储空间来处理(前提是float和int的内存占用相同,通常都是4字节)。
  3. *(int*) &decimal:对转换后的int*指针做解引用操作,读取该地址对应的4字节内存数据,并将其当作int类型的值返回。最后通过hex格式输出,就得到了浮点数底层二进制对应的十六进制表示。

本质上是内存二进制位的直接复用与类型重解释,没有修改任何内存数据,只是改变了编译器对这段内存的解读方式。

内容的提问来源于stack exchange,提问作者Lion King

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:50:08