C51程序编写的时候要注意unsigned long的问题
最近在编写一个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丢失前两字节,可以查一查是不是这个问题。