位移位时是否有n位的限制?

在尝试为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;
}

发表评论