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;
- }
復制代碼
|