C++ 右班工作不正常
我正确地将一个无符号整数移位32,但它根本不影响数字,为什么会发生这种情况C++ 右班工作不正常,c++,bit-shift,C++,Bit Shift,我正确地将一个无符号整数移位32,但它根本不影响数字,为什么会发生这种情况 int main() { unsigned int rnd=2347483648; cout<<rnd; rnd=rnd>>32; cout<<endl<<rnd; } intmain() { 无符号整数rnd=2347483648; cout32; 您可以选择将值分配给rnd吗 rnd = rnd>>32 您缺少一个赋值运算符-换档运算符未
int main()
{
unsigned int rnd=2347483648;
cout<<rnd;
rnd=rnd>>32;
cout<<endl<<rnd;
}
intmain()
{
无符号整数rnd=2347483648;
cout32;
您可以选择将值分配给rnd吗
rnd = rnd>>32
您缺少一个赋值运算符-换档运算符未执行“就地”操作:
您还可以使用复合移位运算符,该运算符应用移位操作,然后将结果赋回变量:
rnd >>= 32;
但是,在这两种情况下,此代码都会导致未定义的行为,请参阅:
如果右操作数的值为负数或大于提升后的左操作数的宽度或等于提升后的左操作数的宽度,则行为未定义
因此,您可以从该操作中获得任何结果。位移位运算符不修改原始数据。它只返回修改后的副本
我想这就是你想要做的:
rnd = rnd >> 32;
假设您的unsigned int
的大小为32位,这并不是一个真正有用的操作。您忘记分配结果:
rnd = rnd >> 32;
按提升的操作数类型中的位数或更多位数进行移位会产生未定义的行为。无符号int
通常为32位,因此在此处进行移位32位或更多位时通常适用
这是因为当移位溢出时,不同的处理器以不同的方式运行,语言设计者不想通过指定特定的行为来阻止实现使用处理器的内置移位指令。它也尝试了……但结果是一样的。您可能会发现,移位量越小,执行起来就越好工作。超出数据类型范围的移动可能会导致未定义的行为。在某些构建/编译器上,它可能会将变量置零,在其他构建/编译器上,它可能会用垃圾数据填充变量,或者干脆什么都不做。基本上,不要这样做。:)我不明白为什么投票被否决,这基本上是一个重要的问题,为什么它不显示为零,因为我是implementing universal hashing,我需要它返回0(这是非常合乎逻辑的),以便我的hash函数为hash Table编制索引对你来说可能是合乎逻辑的,但这不是语言的设计方式。如果你想要一个0,那么只需手动分配0。一定会喜欢这些“核心语言功能X不工作”问题…你能不能多关注一下你正在阅读的书/教程?嗯,rnd=rnd>>32显示了相同的结果,我也尝试过了…但它应该显示0,对吗?现在再看一次问题,这实际上就是问题…哦,我明白了。它被标记为重复。我不得不承认,这个问题的标题要好得多而且搜索更友好。老实说,只有当你知道答案并知道在哪里查找重复项时,问题很可能是重复的。请注意,还有复合移位运算符,a=b
@SBI良好点-这可能算作“就地”:)现在看问题…这就是我的意思…移位32应该得到0,但为什么它没有发生?仔细阅读答案。重要的一点是:这是未定义的行为!这意味着:它不应该得到0。它可以是任何结果,包括x86下“未定义”的NOP行为意味着不会发生移位。第二个参数按第一个参数的宽度(以位为单位)进行模数解释。因此,移位33位意味着移位1位。移位64位意味着再次不移位。
rnd = rnd >> 32;