gpt4 book ai didi

c++ - 右移 g++ 的意外结果

转载 作者:太空狗 更新时间:2023-10-29 19:53:42 24 4
gpt4 key购买 nike

我发现将 uint64_t 值右移 64 位或更多位时会出现异常结果。我原以为下面的代码会输出值 0,但它并没有 - 它输出值>>2 - 但仅使用 g++。

#include <iostream>
#include <cstdint>
using namespace std;
int main(void)
{
uint64_t value = 0x5d4d629e80d5489UL;
int shift = 66;
cout << hex << (value >> shift) << endl;
return 0;
}

我编译并运行:

$ g++ -std=c++0x mad.cpp
$ ./a.out
175358a7a035522
$ uname -a
Linux svr 3.2.0-26-generic #41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

我在另一个装有 g++ (Debian 4.4.5-8) 4.4.5 的 Linux 机器上得到了相同的行为。但是,当我使用 Visual Studio C++(速成版)编译它时,我没有得到相同的行为 - 我得到了我最初预期的结果 - 即 0。

我想知道当 x 和 y 是序数并且 y 大于 x 中的位数时,假设 C++ 中的 x>>y 应该产生 0 是否安全。这是一个 g++ 错误 - 还是这里不符合要求的 Visual C++?我假设这不是/不应该是未定义的行为?这可能是特定于 CPU 的吗?

我意识到我总是可以明确检查超过 8*sizeof(value) 的每个类次 - 但这引入了一个我希望在一些性能关键代码中避免的额外分支。

这是一个已知问题吗?如果是,为了实现一致的跨平台评估,推荐的策略是什么?

最佳答案

来自关于移位运算符的 C++ 标准:

The behavior is undefined if the right operand is ... greater than or equal to the length in bits of the promoted left operand.

关于c++ - 右移 g++ 的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11496957/

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