在 cpp 中将 uint64_t 位移位 uint16_t 时出现奇怪的错误

Mic*_*ney 1 c++ binary hex chess bitboard

下面的函数尝试创建一个位板,其中设置的位位于第 N 个位置,通过位移 0x1 N 次来达到所需的结果。N 由 uint16_t 中的第 1-6 个最低有效位给出。然后将其屏蔽以隔离 6 个 lsb。

uint64_t endSquareFinder(uint16_t a){
    a &= (0x003f);
    return 0x0000000000000001 << a;
}
Run Code Online (Sandbox Code Playgroud)

所有输入均有效,除了 a = 0x001f 时,函数的输出为 0xffffffff80000000 而不是 0x0000000080000000。这对我来说非常奇怪。

gdb编译器

Ted*_*gmo 6

您需要将其转换1为无符号 64 位整数。现在这是一个int...

#include <type_traits>
// this passes:
static_assert(std::is_same_v<decltype(0x0000000000000001), int>);
Run Code Online (Sandbox Code Playgroud)

...很可能只有 32 位。

例子:

return std::uint_least64_t(1) << a;
// or
return 1ull << a; // "unsigned long long int" is at least 64 bits
Run Code Online (Sandbox Code Playgroud)