我想检查一些大的计算内存需求(存储在 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。
我想知道这是编译器错误还是未定义行为。
我是一名优秀的程序员,十分优秀!