C语言共用体内整型与浮点型相互转换

  • Post author:
  • Post category:其他


#include <iostream>

using namespace std;

typedef char (*PTR_TO_ARR)[30];

typedef int (*PTR_TO_FUNC)(int, int);

typedef unsigned int uni32;

typedef unsigned char byte;

int max(int a, int b){


return a>b ? a : b;

}

typedef union

{


byte u8Bit[4];

float fds;

} BYTE4_TO_FLOAT;

int main(){

BYTE4_TO_FLOAT num;

float dinum = 0;

byte pcDsSource[4] = {0x4A,0,0,0};

char *pcDataOut = NULL;

pcDataOut = (char *)malloc(sizeof(byte)*20);

num.u8Bit[0] = pcDsSource[3];

num.u8Bit[1] = pcDsSource[2];

num.u8Bit[2] = pcDsSource[1];

num.u8Bit[3] = pcDsSource[0];

dinum = ( float )num.fds;

num.fds = -2.0;


/*sprintf_s( pcDataOut, 20, pcFormat, dinum );*/

sprintf( pcDataOut,”%-10.2f”, dinum );

system(“pause”);

return 0;

}

IEEE浮点数的存放格式

对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示;

2、第30~23 bit为幂数,其读数值用e表示;

3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x;则按照规定,该浮点数的值用十进制表示为:

=(-1)^s *(1 + x)*2^(e – 127)

对于49E48E68来说,

1、其第31 bit为0,即s = 0

2、第30~23 bit依次为1001 0100,读成十进制就是148,即e = 148。

3、第22~0 bit均为0,也就是二进制的纯小数部分为0,即x = 0。

这样,该浮点数的十进制表示

=(-1)^s * (1 + x)* 2个(e – 127)

=(-1)^0*(1+0)* 2个(148-127)= 2097152.0

把所需要存取的浮点数和一个数组(byte u8Bit[4])构成一个联合,存取的时候用数组,使用的时候用浮点数,如下:

union myfloat

{


byte u8Bit[4];

float fds;

}



版权声明:本文为qq_36208201原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。