最近在編寫一個C51程序的時候,有一個四字節的數據,需要從一個數組中提取出來。結果發現一直出錯。只取出來了后面兩個字節數據,而前面的兩字節則丟失。具體的上代碼。
注意代碼是在KEIL2 的C51中編譯,別的環境可能不一定會出這問題。
uint8_t In[4] = {0x12, 0x34, 0x56, 0x78};
uint32_t Temp;
Temp |= In[0] << 24;
Temp |= In[1] << 16;
Temp |= In[2] << 8;
Temp |= In[3];
輸出結果Temp = 0x5678。
試了好久都不行,后面以為類型定義有錯誤。結果又是對的。
在網上找了好半天,有的說要加L有的說要用(unsigned long)強制類型轉換。經過測試不行。
后面就嘗試用一個中間變量進行轉換,就可以了。代碼如下。
uint8_t In[4] = {0x12, 0x34, 0x56, 0x78};
uint32_t Temp;
uint32_t T1 = 0;
T1 = In[0];
T1 <<= 24;
Temp |= T1;
T1 = 0;
T1 = In[1];
T1 <<= 16;
Temp |= T1;
T1 = 0;
T1 = In[2];
T1 <<= 8;
Temp |= T1;
T1 = 0;
Temp |= In[3];
輸出就為0x12345678了。
這樣操作就可以正常的取出數據了。這個和編譯的環境有關。如果在編寫C51的時候,發現uint32_t丟失前兩字節,可以查一查是不是這個問題。