C51的单片机中右移指令>>为什么有时候最高位会补1

char led,i;
while(1)
{
for(i=0;i<8;i++)
{
led = (0x80>>i );

P0=~led;

}
}
执行段程序并不是单灯右移
但把led = (0x80>>i ); 改为 led = (0x01<<i);却是单灯左移是怎么回事。
注:8个灯接P0口 低电平灯亮

单片机右移分为算术右移和逻辑右移。(左移没有这个问题,0x01<<i就正确)
算术右移最高位是符号位,右移后符号位保持不变(如果一直右移会导致所有位都变成和最高位一样的值)。
逻辑右移才是最高位补0。
led因为是char,编译器会把">>"解释成算术右移,即最高位是符号位(0x80最高位正好是1),保持不变。最后导致结果不对。
led要定义为unsigned char就应该也对了。追答

不好意思。右移的数据是0x80,所以修改led类型不行,而应该修改这个数的类型才有用。
led赋值语句改为: led=(unsigned char)0x80 >> i;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-22
我不知道单片机什么工作原理,但是右移最高位补1是因为内存中存储是以补码形式存储的,右移内存最高位肯定是补1的,你可以了解一下操作系统的左右移位的情况
第2个回答  2020-02-10
这个应该是c51的c语言编程吧?->的意思是info这个指向结构体的指针所指的结构中取名叫irqsource的成员变量。也可以写成(*info).irqsource=0x00;

效果是一样的。
第3个回答  2014-07-22
看看数电吧
第4个回答  2014-07-22
如果你觉得代码没问题,可能你接线接反了。