2 l653423909 l653423909 于 2017.01.11 10:54 提问

c++ 中 0xffffffff >> 32 为什么是 0xffffffff 而不是0?

代码如下:
unsigned long ga = 0xffffffff;
printf("%x %x",ga >> 32,ga >> 31);
无符号右移应该补零啊,右移31位的时候值是1,那么再移一次应该就是0了啊,为什么又是0xffffffff了呢?
难道是我基础不牢固......
各位大神来看看吧,多谢赐教!

5个回答

justin_bkdrong
justin_bkdrong   2017.01.11 11:24

因为 ga >> 32 , 这个32 超出了 shr 的操作数的范围,所以此操作无效, shr dest,count 执行以后 dest 不变 ,所以还是 0xffffffff

alfredseng
alfredseng   2017.01.11 12:00

当移动的位数大于或等于该数据类型位数时,这个时候移动的位数是要进行一个取余的运算,即实际移动位数=N%32。
比如你上面右移32位,32等于数据类型的位数了,则采用取余运算,右移0位,假如你右移33位,则实际上是右移一位。同理你左移65位,实际上相当于左移1位

Ro_bot
Ro_bot   2017.01.11 12:53

不就是带符号右移么,也就是说,符号位1(负)右移,填充的还是1(负)。如果不想填充1(负),那就使用>>>无符号右移。

shen_wei
shen_wei   Ds   Rxr 2017.01.11 17:10
  warning C4293: “>>”: Shift 计数为负或过大,其行为未定义

    cout<<((UINT64)ga >> 32)<<" " <<(ga >> 31);     

在调试状态下是可以看到为零的,但是输出时,因为符号位的问题。。如果把输出扩大即可正确输出0

u012061345
u012061345   2017.01.12 17:55

移位运算要移动的位数超过了限制,是未定义行为。不要推测结果是多少。结果是多少都不对。

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