32位十六进制浮点数转换为十进制浮点数的方法

---------------------------------------------
-- 时间:2019-01-11
-- 创建人:Ruo_Xiao
-- 邮箱:xclsoftware@163.com
---------------------------------------------

        这两天在处理TCP发送数据的问题,对方发来4个字节的浮点数的16进制,当时脑袋一懵,看着这4个16进制的数不知道怎么转成10进制的浮点数了。

        直到后来想到内存中存放的数据的意义完全取决于读取它的方式,例如:3F 80 00 00,按照整数去读,其含义就是1065353216,但是按照浮点数读,其结果就是1。

        所以按照上述思路,解决该问题的方法就是用不同的数据类型读取该内存,即可知道该值的具体含义。

        栗子:

#include<iostream>
using namespace std;

int main() 
{	
	unsigned char s[4]; 
	 
	s[0]=0x00; 
	s[1]=0x00;
	s[2]=0x80;
	s[3]=0x3f; 
	
	float *pf1=(float*)s;
	float f2;
	memcpy_s(&f2 , sizeof(float) , s , 4);

	cout<<"结果:"<<endl;
	cout<<"pf1 = "<<*pf1<<endl;
	cout<<"f2 = "<<f2<<endl;

	cin.get();
	return 0;
}

    结果为:

        有些小伙伴可能会有疑问,1的4个字节的十六进制浮点数是 3F 80 00 00,为什么例程中 s 的数组中数值的顺序是00 00 80 3F呢?其实该答案是因为我的电脑的系统是Windows,所以在内存中字节摆放时序是小端模式,即:低字节放入内存低地址中,高字节放入高地址中。所以按照Windows检测,其s中数据的排布正好是3F 80 00 00。所以按照float型读取,该内存中的值即为1

拓展

        实际上32位十六进制浮点数是如何转换为十进制浮点数的呢。咱们来举栗说明:

58 65 80 00,其二进制为 0101 1000 0110 0101 1000 0000 0000 0000

(1)符号位为0,则该浮点数是正数。

(2)指数部分为101 1000 0,转换成十进制为176,再减去127,得到指数位为49。

(3)尾数部分为110 0101 1000 0000 0000 0000,转成小数的方法是从小数点开始,第1个小数乘以2的(-1)次方,第2个小数乘以2的(-2)次方,以此类推,所有的结果相加就是小数。经过计算,尾数部分的结果为0.79296875。

经过上述操作,该实数为1.79296875*2的49次方,最终结果为:1.009351674298368*10的15次方。

 

关于float在内存中的表达请看如下链接:https://blog.csdn.net/itworld123/article/details/78914969

 

(SAW:Game Over!)

  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值