gpt4 book ai didi

c++ - 与 uint64_t 斗争

转载 作者:行者123 更新时间:2023-12-05 09:25:53 28 4
gpt4 key购买 nike

我想在 64 位数字中设置各个位,并认为 uint64_t是这份工作的理想选择。我遇到了一些奇怪的问题,所以我做了一些实验:

我写了下面的测试程序:

#include <iostream>
#include <cstdint>
#include <iomanip>

int main()
{

uint64_t test_value = 0;

for( int i=0; i<63; ++i ) {
test_value = (1 << i);
std::cout << hex << test_value << "\n";
}

return 0;
}

输出结果让我吃惊:

1
2
4
8
10
... (irrelevant output elided)
10000000
20000000
40000000
ffffffff80000000
1
2
4
8
10
...
10000000
20000000
40000000

我测试了最大值 ( std::cout << hex << std::numeric_limits<uint64_t>::max() << std::endl )导致 ffffffffffffffff正如预期的那样。

我在 Fedora 37 上运行 gcc 12.2.1。

看起来我的 unsigned int 在第 31 位变为有符号,并在第 32 位翻转。我是否缺少编译器设置?非常感谢任何帮助。

最佳答案

你的编译器应该警告过你。
在这一行中:

test_value = (1 << i);

1 是一个 int 文字(而 int 通常是 32 位)。

例如在 MSVC 中我得到:

warning C4334: '<<': result of 32-bit shift implicitly converted to 64bits (was 64-bit shift intended?)

你应该把它改成:

//-------------vvv-------
test_value = (1ull << i); // You can also use: (uint64_t)1 instead of 1ull

现在您将获得预期的输出。

关于c++ - 与 uint64_t 斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74839482/

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