【问题标题】:Left shifting with a unit64_t - Gives warning使用 unit64_t 左移 - 发出警告
【发布时间】:2018-08-26 04:36:49
【问题描述】:

我正在尝试执行以下操作。但是我不确定我可能会出错

uint64_t x = (1 << 46); 
std::cout << x;

我明白了

-警告:左移计数>=类型[-Wshift-count-overflow]的宽度

我得到输出 0。我期待像这样的二进制十进制输出

1 0000........00 (46 0s) 

我的问题是为什么我会收到此警告? uint64_t 不是 64 位吗?还有为什么我得到输出 0 ?

【问题讨论】:

标签: c++


【解决方案1】:

问题在于您没有移动 64 位常量:1int 类型的常量,在您的平台上小于 64 位(可能是 32 位;它是实现定义的)。

您可以通过在常量周围使用UINT64_C 宏来解决此问题:

uint64_t x = (UINT64_C(1) << 46); 

【讨论】:

  • UINT64_C 是标准 C/C++ 的一部分吗?
  • @KaiserKatze 是的,它是&lt;cstdint&gt;的一部分
  • 或者你可以用类型后缀装饰常量:1ull。
【解决方案2】:

1 是一个 32 位常量。编译器(正确地)将常量表达式计算为 0 --- 1 超出了 int32 的大小。如果

【讨论】:

  • 移动比类型的宽度更宽是未定义的行为(不是 0)
  • 为什么在 x86 CPU 上使用变量会使其移位 14?
  • @SamiKuhmonen • 未定义的行为可能会做意想不到的事情。在这种情况下,x86 对班次进行模 32。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 2023-03-10
相关资源
最近更新 更多