Keil C51 遇到的移位问题

有个自动上传状态变化的代码

使用stc15单片机在Keil C51上

unsigned long State;//状态

unsigned long StaBkp;//状态备份

/***************************************************************Author:Liming***

* @brief 状态自动上报

* @param None

* @retval None

****************************************************************0x49E7FC7B*****/

uint8_t AutoReport(void)

{

  uint8_t i;

  uint32_t res;

  uint32_t temp;

  State = GetSta();//获取状态

  res = (StaBkp^State);//获取状态差异

  if(res != 0)//有差异{

    for (i = 0; i < 24; i++){

      //temp = 1;

      //if ((res&(temp<<i)) != 0)

      if ((res&(0x00000001UL<<i)) != 0){

        //temp = 1;

        //StaBkp ^= (temp<<i);//修正状态

        StaBkp ^= (0x00000001UL<<i);//修正状态

        //temp = 1;

        //if ((State &(temp<<i)) == 0)

        if ((State &(0X00000001UL<<i)) == 0)

          TX1.Buff[7] = 0x00;

        else

          TX1.Buff[7] = 0x01;

        TX1.Cnt = 8;

        return SUCCESS;//需要上报

      }

    }

  } 

  return ERROR;

}

注意程序中红色的UL必须要加上,不然就会出现问题,编译器会把0x00000001以int类型来处理,Keil C51的int 类型为16位,所以会出现17-32位的数据异常。

感谢网友的经验https://bbs.21ic.com/icview-606362-1-1.html 第18楼的回复。

当然,换个做法就是使用注释掉的代码,先定义一个变量temp,每次要使用移位的数据,先temp=1,再移位,再使用temp的值。

原文地址:https://www.cnblogs.com/IdeaMing/p/13296814.html