关于移位运算的一个问题,十分不解

今天发现一个问题, 假如 i = 12, 那么 j = i >> 32, 则j = 12;但是j = i >> 31,j = j >> 1,则j = 0为什么呀。

对于右移大于或等于位宽的操作,或者右移负数的操作,其结果将依赖于编译器的处理和硬件指令的处理,并不唯一。32正好是一个int变量所占的内存,但这种位移的行为是未定义的。由编译器决定,所以没有标准答案。在VC++编译器上是等于原值的
LZ可以看一下汇编的代码就会发现,编译器直接把代码编译成了赋值操作,而没有做移位操作.
所以第一种情况下还是原值,而第二种由于移位小于32位,所以就按正常的移位操作来,就得到了0

int的位数最大就是32位,移位位数大于或者等于数据类型的位数,则会使用余数进行移位。
也就是32%32=0,等于不位移。
31%32=31,右移31位,肯定变成0了

原来是这样的,长知识 了!谢谢!

可以理解为这样的,编译器首先将要移位的数字模32取余数,然后再移相应的位数,这样就能解释上面的现象了。不过,关于移位,不同的编译器可能处理方式不同