打印

关于KEIL中C语言右移操作符的教训

[复制链接]
3715|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiezhaoxuan|  楼主 | 2015-12-20 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  今天用STM32芯片驱动一个18B20,本来很简单的时序,结果硬是整了一天,读回来的温度数据,第一个字节是对的,第二个字节却总是一个固定的0x03,反复检查时序没有发现问题,后来试着将一个局部变量赋了初值,结果正常了。。。
  那个局部变量就是用来保存读出的温度数据的,代码如下:
uint8_t B20General_ReadByte(B20_StructTypeDef *B20_StructTemp)
{
        uint8_t B20_Num1,B20_Num2;

        for(B20_Num1=8;B20_Num1>0;B20_Num1--)
        {
                Timer2_Delayus(2);
                B20General_PinSwitch(B20_StructTemp,OUT); //切换写
                B20General_PinOutput(B20_StructTemp,LOW);  //拉低
                Timer2_Delayus(2);
                B20_Num2>>=1;
                B20General_PinSwitch(B20_StructTemp,IN);  //切换为读
                B20General_PinOutput(B20_StructTemp,HIGH);  //拉高
                Timer2_Delayus(11);  
                if (B20General_PinInput(B20_StructTemp))
                        B20_Num2|=0x80;
                Timer2_Delayus(55);
        }
        B20General_PinSwitch(B20_StructTemp,OUT); //切换写
        return B20_Num2;
}
之前一直认为,右移(>>)后前面是补0的,所以程序中只判断了读到1的情况,结果却总是不正常,后来将B20_Num2的变量初始化为0,就正常了,然后再改回原来的情况调试观察,发现若B20_Num2的最高位不为0时,右移后移进来的位有时是1,有时是0。。。
  之后在网上查了一下,说是根据机器或环境不同,右移进来的位的说法也不一样,这个之前还真没注意过啊,看来以后还是不能偷懒,要注意程序中的严谨性,要不然找问题,很麻烦。。。

评分
参与人数 1威望 +6 收起 理由
dirtwillfly + 6 很给力!感谢分享

相关帖子

沙发
dirtwillfly| | 2015-12-20 22:16 | 只看该作者

使用特权

评论回复
板凳
xiezhaoxuan|  楼主 | 2015-12-20 22:19 | 只看该作者
以后要养成习惯,局部变量要赋初值,省的出现莫名其妙的问题

使用特权

评论回复
地板
河东猴| | 2015-12-21 13:05 | 只看该作者

使用特权

评论回复
5
cov0xt| | 2015-12-21 13:38 | 只看该作者
移位的时候,可能把旁边内存里,已被丢弃的变量的值,装入新位置里

使用特权

评论回复
6
diweo| | 2015-12-21 15:46 | 只看该作者
本帖最后由 diweo 于 2015-12-21 15:48 编辑

:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

22

帖子

1

粉丝