在尝试为bitboard类提出方案时,我决定使用全局编译时变量来表示关键位板配置,例如。所有黑车的初始位置。
constexpr uint64_t BLACK_ROOK_INIT = 0x1 | (0x1 << 56);
但是我收到了编译错误。编译器似乎将此值视为32位值,类型转换或添加额外的0似乎没有什么区别。类型定义来自。
一旦我从这个表达式中删除了constexp,它就会编译,但是仍会产生等效的警告。为什么会这样?我认为它可能是预处理器的限制,但问题仍然存在,没有constexp。
chess.cpp:16:64: error: right operand of shift expression ‘(1 << 56)’ is >= than the precision of the left operand [-fpermissive]
仅供参考,这也无法编译
constexpr int64_t BLACK_ROOK_INIT = (int64_t)0x1 | (int64_t)(0x1 << 32);
答案 0 :(得分:2)
这就是你想要的:
#include <iostream>
int main(){
constexpr uint64_t BLACK_ROOK_INIT = 0x1ULL | (0x1ULL << 56);
std::cout<<BLACK_ROOK_INIT<<std::endl;
}
默认情况下,0x1
值为int
,通常实现为32位整数。
后缀讨论here。如果他们让你有点不舒服,就像他们对我一样,你可以按如下方式进行投射:
#include <iostream>
int main(){
constexpr uint64_t BLACK_ROOK_INIT = (uint64_t)(0x1) | ((uint64_t)(0x1) << 56);
std::cout<<BLACK_ROOK_INIT<<std::endl;
}