在c语言中二进制输入转换十进制单浮点数(float)的代码实现

前言

在信号传输过程中遇到了如下问题:
输入端得到的是电脑存储的二进制float类型的数据(共32位,1位为符号位,2-9位为指数位,10-32位为尾数位),但输出端需要得到十进制的float类型数据。

比如:
输入:0b0100000010111000,0b0000000000000000
输出:5.75

最开始的想法是将两个16位的二进制连起来,然后直接输出float类型的数据,但由于float数据类型在计算机中的编码方式并不是单纯的一位一位数字连续存储,而是按1位为符号位,2-9位为指数位,10-32位为尾数位存储,所以需要以编写解码的方式才能输出十进制float。

代码

#include <stdio.h>
#include <math.h>
int main()

{
int a = 0b0100001001101010;  //输入的前16位二进制 
int b = 0b1000000000000000;  //输入的后16位二进制 
long temp, weishu, flag, i, zhishu;  // temp是中间变量,尾数指最后23位,flag判断符号位,指数为2-9位 
float ans,xiaoshu=0;  // ans指最后的输出的十进制浮点数,xiaoshu为小数部分,其实是+1后的小数部分 
long list[3]={2147483648,2139095040,8388607};  //  2147483648取符号位, 2139095040取指数部分, 8388607取尾数部分 

temp = (a<<16) + b;  // 输入的32位的十进制数 ,一定要加括号,不然就先算的+b
weishu = list[2]&temp;
zhishu = ((list[1]&temp)>>23)-127; //减法操作优先于位移操作,位移操作优先于与操作 
flag = (list[0]&temp)>>31;
weishu = weishu|8388608;  // +1操作,因为float最高位是保留了1的 

for(i=0;i<=23;i++)
{
	//temp2 = ((weishu&(1<<(23-i)))>>(23-i));   //又一次,位移操作优先于与操作!,作为调试部分 
	if(((weishu&(1<<(23-i)))>>(23-i))==1)  // 判断对应位置是1还是0,然后将其转化为十进制数 
		{
			xiaoshu += pow(2, -1*i);
		}
}

ans = xiaoshu*pow(2, zhishu)*pow(-1,flag);  //这里我是先+1,然后算出对应十进制数,再移位的 
printf("%f",ans);

return 0;
}

代码结果

在这里插入图片描述

公式链接

具体二进制转十进制浮点数的公式和计算过程可以参考下面两个链接:
C语言中float(浮点数)与二进制的转换关系
浮点数十进制与二进制之间的转换

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值