根据位操作将八位十六进制转化为浮点数

回眸只為那壹抹淺笑 提交于 2019-12-02 06:44:52
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 //*********************************************//
 4 //****name:     八位十六进制数转浮点数输出        ***//
 5 //****length:    32位                         ***//
 6 //****formula:    x[真值] = ((-1)^s)*1.M*(2^E) ***//
 7 //****time:        2019-10-24                 ***//
 8 //**********************************************//
 9 
10 
11 #define NUMBER_SIGN            1  //数符
12 #define FRAME_SHIFT            8  //移码
13 #define CODING                32 //编码
14 #define DIDITAL_CODING        23 //数码
15 
16 float HextoFloat(unsigned int hex)
17 {
18     int i = 1;//提供2的n次方
19     unsigned int ihex = (hex << NUMBER_SIGN);
20     unsigned int decimal_bin = 0;
21     unsigned int dacade = 0;
22     double value;
23     double decimal = 0;
24     int s = (hex >> (CODING - NUMBER_SIGN));//数符
25     int E = (ihex >> (NUMBER_SIGN + DIDITAL_CODING)) - 127;//指数
26     if (E > 0) {
27         dacade = ((ihex << FRAME_SHIFT) >> (CODING - E)) + (i << E);//整数,IEEE754标准
28         decimal_bin = ((ihex << (FRAME_SHIFT + E)) >> (NUMBER_SIGN + FRAME_SHIFT + E));//小数二进制预处理
29     }
30     if (E <= 0){
31         decimal_bin = (ihex << FRAME_SHIFT) >> (FRAME_SHIFT+ NUMBER_SIGN)+(i << (DIDITAL_CODING+1));//小数二进制预处理,整数位为0,IEEE754标准
32     }
33     value = (i << (DIDITAL_CODING - E));    
34     decimal = double(decimal_bin / value);    //小数
35     return s == 0 ? double(dacade + decimal) : double((-1) * (dacade + decimal));
36 }
37 int main()
38 {
39     unsigned int a = 0x80102000;
40     unsigned int b = 0x41360000;
41     unsigned int c = 0x41A4C000;
42     unsigned int e = 0x00000000;
43     unsigned int d = 0x80000000;
44     unsigned int f = 0xFFFFFFFF;
45     unsigned int g = 0x7FFFFFFF;
46     printf("\n十六进制数:%x  浮点数:%.8f\n",a,HextoFloat(a));
47     printf("十六进制数:%x  浮点数:%.8f(课本)\n", b, HextoFloat(b));
48     printf("十六进制数:%x  浮点数:%.8f(课本)\n", c, HextoFloat(c));
49     printf("十六进制数:%x  浮点数:%.8f(最大负数)\n", d, HextoFloat(d));
50     printf("十六进制数:%8x  浮点数:%.8f(最小正数)\n", e, HextoFloat(e));
51     printf("十六进制数:%x  浮点数:%.1f(最小负数)\n", f, HextoFloat(f));
52     printf("十六进制数:%x  浮点数:%.1f(最大整数)\n", g, HextoFloat(g));
53     system("pause");
54     return 0;
55 }

根据位操作将八位十六进制转化为浮点数,

1.注意不同机器上位操作可能有些偏差

2.遵循IEEE574标准

3.2^n可由位运算快速算出

4.已在vs2019上测试成功

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!