直接上代码,具体原理可以上网查找,这里只是用代码实现原理。
//遵循ieee754标准
#include <stdio.h>
#include <math.h>
typedef unsigned char u8;
typedef unsigned int u32;
float HextoFloat(u32 val);
u32 FloattoHex(float val);
int main(void)
{
float a,b;
u32 c,d;
while(1)
{
printf("请输入一个小数:");
scanf("%f",&b);
d=FloattoHex(b);
printf("%x\n",d);
printf("请输入一个32bit的数(16进制):");
scanf("%x",&c);
a=HextoFloat(c);
printf("%f\n",a);
}
}
//H->D
float HextoFloat(u32 val)
{
u8 yw,power,i,flag,sign;
u32 ws,ws1,ws2,c=1,b[32],d;
float decimal=0.0,result=0.0,a[32];
//初始化数组
for(i=0;i<32;i++)
{
b[i]=(c<<(31-i));
a[i]=(float)pow(2,0-i-1);
}
//判断符号位确定正负
if((val&b[0])>0) flag=1;//负数
else flag=0; //正数
//求幂数
d=(val&0x7F800000)>>23;
if(d>=127)
{
sign=1;//右移
power=d-127;
}
else
{
sign=0;//左移
power=127-d;
}
//尾数处理
ws=((val&0x007FFFFF)|0x00800000);
//移位
if(sign==1)
{
yw=1+power;
ws1=(ws>>(24-yw))%256;
ws2=ws<<(yw+8);
for(i=0;i<32;i++)decimal+=(float)((ws2&b[i])>>(31-i))*a[i];
}
if(sign==0)
{
yw=power-1;
ws1=0;
ws2=ws<<(8-yw);
for(i=0;i<32;i++)decimal+=(float)((ws2&b[i])>>(31-i))*a[i];
}
//求取结果
if(flag==0)result=(float)ws1+decimal;
if(flag==1)result=0.0-((float)ws1+decimal);
return result;
}
//D->H
u32 FloattoHex(float val)
{
float a=val;
u32 result;
result = *(u32*)&a;
return result;
}