右移操作员

时间:2011-03-06 22:33:08

标签: operator-keyword bit-shift

我今天花了几个小时寻找虫子,直到找到 我不明白的东西。

这是我一直在使用的代码:

unsigned long k,l,m;
k = 1000;
l = 33;
m = k>>l;

它提供了m=500,即它显然会移动l mod 32

我逻辑上预期为0。

这是我刚忽略的东西,从未注意过吗?

3 个答案:

答案 0 :(得分:1)

在C中,我认为没有指定如果你使用的移位太大而不能移动的值大小会发生什么,所以移位数换行是完全可以接受的(并且是x86和IIRC) PowerPC做)。在Java中,您看到的包装行为是强制性的。

答案 1 :(得分:1)

ANSI C标准说:

  

如果右操作数的值是   否定或大于或   等于晋升的宽度   左操作数,行为是   未定义。

因此,换挡33与33换挡一次不相同......

答案 2 :(得分:0)

你有可能混淆1(一)和l(字母L),因为这在我之前发生过!! (可以通过改变x = 33来重复检查; m = k>> x?)