右移无法正常工作
Right Shift not working properly
我将无符号的 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;
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程