在尝试为bitboard类提出方案时,我决定使用全局编译时变量来表示关键的bitboard配置,例如所有black Rook的初始位置
constexpr uint64_t BLACK_ROOK_INIT=0x1 |(0x1<;<;56);
然而,我得到了编译器错误。编译器似乎将此值视为32位值,而类型转换或添加额外的0似乎没有什么区别。类型定义来自
一旦我从这个表达式中删除constexp,它就会编译,但是仍然会产生等效的警告。为什么会这样?我认为这可能是预处理器的一个限制,但问题仍然存在,没有constexp
chess.cpp:16:64:错误:移位表达式“(1<;<;56)”的右操作数为>;=大于左操作数的精度[-fppermissive]
仅供参考,本文件也未编译
constexpr int64_t BLACK_ROOK_INIT=(int64_t)0x1 |(int64_t)(0x1<;32);
这就是你想要的:
#包括<;iostream>;
int main(){
constexpr uint64_u t BLACK_ROOK_INIT=0x1ULL |(0x1ULL<;<;56);
标准::cout<;<;BLACK\u ROOK\u INIT<;<;标准::endl;
}
默认情况下,0x1值是一个int,通常实现为32位整数
这里讨论后缀。如果他们让你有点不舒服,就像他们对我一样,你可以投下如下的角色:
#包括<;iostream>;
int main(){
constexpr uint64_t BLACK_ROOK_INIT=(uint64_t)(0x1)|((uint64_t)(0x1)<;<;56);
标准::cout<;<;BLACK\u ROOK\u INIT<;<;标准::endl;
}