两种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. 第二种方法的转换机制
步骤拆解如下:
&decimal:获取浮点数变量decimal的内存地址,此时指针类型为float*。(int*) &decimal:将float*类型的指针强制转换为int*类型,告诉编译器:把这个地址指向的内存区域,当作int类型的存储空间来处理(前提是float和int的内存占用相同,通常都是4字节)。*(int*) &decimal:对转换后的int*指针做解引用操作,读取该地址对应的4字节内存数据,并将其当作int类型的值返回。最后通过hex格式输出,就得到了浮点数底层二进制对应的十六进制表示。
本质上是内存二进制位的直接复用与类型重解释,没有修改任何内存数据,只是改变了编译器对这段内存的解读方式。
内容的提问来源于stack exchange,提问作者Lion King
相关产品推荐
相关产品推荐

