c++ - 位移时有n位的限制吗?

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

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

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/

相关文章:

java - Java 中的位操作 - 2 的补码和翻转位

c++ - Bithacking 比较(较少)运算符

c - C中的逻辑运算符有什么意义?

C++ header - 包含时的最佳实践

c++ - 如何获得忘记算术运算的警告?

c++ - gcc 中库 dl 的含义

c++ - 如何有效地将按位运算应用于(大)压缩位 vector ?

c++ - 无法循环遍历矩形图像矩阵的所有像素

assembly - `test` 指令是如何工作的?

java - 没有溢出的两个整数(或长整数)的平均值,向 0 截断