2 cocowuyung cocowuyung 于 2016.03.13 20:02 提问

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

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

4个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.13 21:39
已采纳

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

danielinbiti
danielinbiti   Ds   Rxr 2016.03.13 21:17

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

u014070086
u014070086   2016.03.14 09:11

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

hijack00
hijack00   Rxr 2016.08.26 22:54

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!