gpt4 book ai didi

c++ - 是否将一个无符号整数右移了它的总位数 UB ?

转载 作者:太空宇宙 更新时间:2023-11-04 16:09:11 25 4
gpt4 key购买 nike

<分区>

我想检查一些大的计算内存需求(存储在 unsigned long long 中)是否与用于编译我的代码的内存模型大致兼容。

我假设当且仅当内存需求适合虚拟地址空间(独立于实际操作系统限制)时,将需求右移指针中的位数将导致 0。

不幸的是,在某些编译器上将 64 位数字移位 64 位时,我发现了一些意想不到的结果。

小演示:

const int ubits =  sizeof (unsigned)*8;  // number of bits, assuming 8 per byte
const int ullbits = sizeof (unsigned long long)*8;
cout << ubits << " bits for an unsigned\n";
cout << ullbits << " bits for a unsigned long long \n";

unsigned utest=numeric_limits<unsigned>::max(); // some big numbers
unsigned long long ulltest=numeric_limits<unsigned long long>::max();

cout << "unsigned "<<utest << " rshift by " << ubits << " = "
<< (utest>>ubits)<<endl;
cout << "unsigned long long "<<ulltest << " rshift by " << ullbits << " = "
<< (ulltest>>ullbits)<<endl;

我预计两个显示的 rshit 结果都是 0。

works as expected with gcc .

但是对于 MSVC 13:

  • 在 32 位调试中:unsigned 的 32 位 rshift 没有效果(显示原始数字)但 unsigned long long 的 64 位移位如预期的那样为 0。
  • 在 64 位调试中:rshift 在这两种情况下都没有效果。
  • 在 32 位和 64 位版本中:rshif 在两种情况下都如预期的那样为 0。

我想知道这是编译器错误还是未定义行为。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com