右移无法正常工作

Right Shift not working properly

本文关键字:工作 常工作 右移      更新时间:2023-10-16

我将无符号的 int 移动 32 是正确的,但这根本不影响数字,为什么会这样?

int main()
{
  unsigned int rnd=2347483648;
  cout<<rnd;
  rnd=rnd>>32;
  cout<<endl<<rnd;
}

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

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

rnd = rnd >> 32;

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

rnd >>= 32;

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

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

因此,您可以从该操作中获得任何结果。

按提升的操作数类型中的位数或更多位数移动会产生未定义的行为。 unsigned int通常为 32 位,因此这通常适用于像此处一样移位 32 位或更多位的情况。

这是因为当班次溢出时,不同的处理器以不同的方式运行,并且语言设计者不希望通过指定特定行为来阻止实现使用处理器的内置移位指令。

位移运算符不会修改原始数据。它只是返回修改后的副本。

我认为这就是你的意思:

rnd = rnd >> 32;

假设您的unsigned int大小为 32 位,这并不是一个真正有用的操作。

你可以将值分配给RND

rnd = rnd>>32

您忘记分配结果:

rnd = rnd >> 32;