标题:
关于C语言中float、double类型的内存转换
[打印本页]
作者:
toomark
时间:
2020-4-8 10:19
标题:
关于C语言中float、double类型的内存转换
C51 平台上存在数据类型限制——double数据类型与float数据类型皆为32bites,使得double数据类型等同于float数据类型。
当C51在与其它平台做数据通信时,可能被要求提供64bites的double数据,但它无法用数据类型强转实现。因此,专门写了float转double存储的函数。
有关float、double类型在内存中的具体存储方式,可阅读相关博文
https://blog.csdn.net/slience_j/article/details/51965009
实现float存储转double类型存储的具体函数如下:
#pragma pack(1)
struct DOUBLE_MEM
{
char data0;
char data1;
char data2;
char data3;
char data4;
char data5;
char data6;
char data7;
};
#pragma pack()
void float_to_double(float f, struct DOUBLE_MEM *pStrBob)
{
short index; // 指数
long *pdata = (long *)&f; // 指针指向需转换float数据
// 获取float变量8位有效指数信息
index = (*pdata >>23)&0x00ff;
// 将8位指数转换为11位指数
if(index & 0x0080) // 指数为正(bit7表示正负,bit0~6为大小)
{
index &= 0x007f; // bit7~15置0
index |= 0x0400; // bit10 置1
}else
{
index |= 0xff80; // bit 7~15置1
index &= 0x03ff; // bit10~15置0
}
// 装载index指数信息
pStrBob->data0 = (index>>4)&0x7f; // 将index的高7位(bit4~10位)数据放在低7位存储
pStrBob->data1 = (index &0xf)<<4; // 将index的低4位(bit0~3位)数据放在高4位存储
// 装载符号信息(存放在最高位)
if(*pdata & 0x80000000)
{
pStrBob->data0 |= 0x80;
}
else
{
pStrBob->data0 &= 0x7f;
}
// 装载尾数位(bit0~bit22共23位有效数据)
pStrBob->data1 |= (*pdata >>19)&0x0f; // 将bit19~22 放至data1的低4位
pStrBob->data2 = (*pdata >>11)&0xff; // 将bit11~18 放至data2
pStrBob->data3 = (*pdata >>3)&0xff; // 将bit3~bit10放至data3
pStrBob->data4 = (*pdata &0x7)<<5; // 将bit0~bit2 放至data4的高3位
pStrBob->data4 &= 0xe0; // data4的低5位清零
pStrBob->data5 = 0x0;
pStrBob->data6 = 0x0;
pStrBob->data7 = 0x0;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1