代码如下:
unsigned long ga = 0xffffffff;
printf("%x %x",ga >> 32,ga >> 31);
无符号右移应该补零啊,右移31位的时候值是1,那么再移一次应该就是0了啊,为什么又是0xffffffff了呢?
难道是我基础不牢固......
各位大神来看看吧,多谢赐教!
当移动的位数大于或等于该数据类型位数时,这个时候移动的位数是要进行一个取余的运算,即实际移动位数=N%32。
比如你上面右移32位,32等于数据类型的位数了,则采用取余运算,右移0位,假如你右移33位,则实际上是右移一位。同理你左移65位,实际上相当于左移1位
因为 ga >> 32 , 这个32 超出了 shr 的操作数的范围,所以此操作无效, shr dest,count 执行以后 dest 不变 ,所以还是 0xffffffff
不就是带符号右移么,也就是说,符号位1(负)右移,填充的还是1(负)。如果不想填充1(负),那就使用>>>无符号右移。
warning C4293: “>>”: Shift 计数为负或过大,其行为未定义
cout<<((UINT64)ga >> 32)<<" " <<(ga >> 31);
在调试状态下是可以看到为零的,但是输出时,因为符号位的问题。。如果把输出扩大即可正确输出0
移位运算要移动的位数超过了限制,是未定义行为。不要推测结果是多少。结果是多少都不对。