在尝试为位板类提出方案时,我决定使用全局编译时变量来表示关键的位板配置,例如。所有黑鸦的初始位置。

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);

最佳答案

这就是你想要的:

#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;
}

关于c++ - 移位时是否有n位的限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45603723/

10-10 19:59