当前位置: 代码迷 >> 单片机 >> 51单片机C语言移位操作的疑问解决方法
  详细解决方案

51单片机C语言移位操作的疑问解决方法

热度:98   发布时间:2016-04-28 15:06:56.0
51单片机C语言移位操作的疑问
A:
i = 0xF9<<1;
i = i>>1;
P0 = i;

B:
P0 = (0xF9<<1)>>1;

如上A和B两种方式,为什么A可以真正实现移位,而B不可以呢?
------解决方案--------------------
如果编译器够“聪明”,它就不会真的去做 B 中的无效移位。
------解决方案--------------------
去看一下编译出的汇编码就知道了。我猜 P0 = (0xF9<<1)>>3; 也会编译成直接右移 2 位。
------解决方案--------------------
引用:
去看一下编译出的汇编码就知道了。我猜 P0 = (0xF9<<1)>>3; 也会编译成直接右移 2 位。


++
------解决方案--------------------
目测你i定义的是无符号型。

对于移位,有算术移位和逻辑移位,编译器会根据数据的类型选择编译成算术移位还是逻辑移位。

对于无符号型,选择逻辑移位,右移后,高位会用0填充,

对于有符号型,选择算术移位,右移后,高位会被填充1.

你的例子中,i应该是定义成了无符号性,而0xf9,默认是有符号型。
------解决方案--------------------
另外,顶一下楼主,上半年还在搞数据库,现在就搞单片机,这覆盖面太广了,敬仰。
------解决方案--------------------
引用:
另外,顶一下楼主,上半年还在搞数据库,现在就搞单片机,这覆盖面太广了,敬仰。
搞数据库的为什么来搞单片机啊
------解决方案--------------------
数据库比较简单写,SQL用较多单片机弄久就懂,
  相关解决方案