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.遵循IEEE547標準spa
3.2^n可由位運算快速算出code
4.已在vs2019上測試成功orm