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丢失前两字节,可以查一查是不是这个问题。

posted @ 2020-04-15 15:04  清风明月2018  阅读(1899)  评论(3编辑  收藏  举报