右移不正常

Ahm*_*med 2 c++ bit-shift

我正确地将unsigned int移动了32但它根本不影响数字,为什么会发生?

int main()
{
  unsigned int rnd=2347483648;
  cout<<rnd;
  rnd=rnd>>32;
  cout<<endl<<rnd;
}
Run Code Online (Sandbox Code Playgroud)

当代码运行时,它会显示两次rnd,完全没有任何影响.我相信在右移32位int后,它不应该显示为零吗?

And*_*ter 11

您缺少一个赋值运算符 - >>移位运算符不会"就地"执行操作:

rnd = rnd >> 32;
Run Code Online (Sandbox Code Playgroud)

您还可以使用复合移位运算符,它应用移位操作,然后将结果分配回变量:

rnd >>= 32;
Run Code Online (Sandbox Code Playgroud)

但是,在这两种情况下,此代码都会导致未定义的行为,请参阅 将32位整数移位32位:

如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义.

所以你可以从那个操作得到任何结果.

  • 仔细阅读答案.重点是:这是未定义的行为!这意味着:它不应该导致0.它可以是任何东西,包括NOP. (4认同)