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

时间:2017-08-10 03:01:00

标签: c++ bit-manipulation bitwise-operators constexpr

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

1 个答案:

答案 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;
}