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上测试成功