标题: 在写一个程序时发现,数据低八位会发生丢失,求大神指导 [打印本页]

作者: goer.lu    时间: 2015-6-2 16:07
标题: 在写一个程序时发现,数据低八位会发生丢失,求大神指导
先贴代码

void main()
{
        unsigned int a=0x1c00;
        unsigned char b;
        (unsigned int)b=a;
        b=b>>8;
        uart_init();
        while(1)
        {
                TI=1;
                ES=0;
                printf("%x \r\n",b);
                printf("%d \r\n",b);
                Delay(10000);
        }
       
}


我在写其他程序时出现了数据丢失问题,就写了这个小程序测试了下,果然如此。。。。。
求助下, 怎么样让数据右移八位不丢失啊,输出b=0x1c;


作者: lxa0    时间: 2015-6-2 20:15
更换单片机芯片~~~~~~~~~~
作者: ahshmj    时间: 2015-6-3 22:01
在汇编中,   RRC 指令功能:累加器内容连同进位标志位(c)循环右移一位(C进入最高位,最低位进入C,也就是9位圆周循环)
    操作内容:      A7←(C)      An←(An+1)    C←(A0)       (n=0~6)
  (RLC  类似)

在C51中操作符右移为">>",每执行一次右移指令,操作数最高低移入CY,CY中本来的数丢失,最高位补0,其他位依次向右移动1位。左移指令类同。也就是说不采取其他措施,移出去的一位就丢失了。 类似于汇编的 “RR”。C语言中没有单独的 类似于"RLC"或"RRC"的语句。
所以如果  b=b>>8 ,高8位进入低8位,高8位补8个”0“,低8位就丢失了。(假设b为16位数据)。
作者: yanjibao    时间: 2015-6-4 08:34
太明显了,b改成uint就好了,51里面搞强制类型转换不是很推荐
作者: goer.lu    时间: 2015-6-4 19:17
lxa0 发表于 2015-6-2 20:15
更换单片机芯片~~~~~~~~~~

不用吧,设置了个中间变量,好了。。。。。。。
作者: goer.lu    时间: 2015-6-4 19:17
ahshmj 发表于 2015-6-3 22:01
在汇编中,   RRC 指令功能:累加器内容连同进位标志位(c)循环右移一位(C进入最高位,最低位进入C,也就 ...


作者: goer.lu    时间: 2015-6-4 19:18
yanjibao 发表于 2015-6-4 08:34
太明显了,b改成uint就好了,51里面搞强制类型转换不是很推荐

嗯,改了,好了,谢了啊。。。。。。。。。
作者: gh2128    时间: 2015-6-4 20:39
建议多看基础
作者: cdtesscd    时间: 2015-6-5 10:45
b改成uint应该可以




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1