使用 unit64_t 左移 - 发出警告

Posted

技术标签:

【中文标题】使用 unit64_t 左移 - 发出警告【英文标题】:Left shifting with a unit64_t - Gives warning 【发布时间】: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 ?

【问题讨论】:

warning: left shift count >= width of type的可能重复 【参考方案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。

以上是关于使用 unit64_t 左移 - 发出警告的主要内容,如果未能解决你的问题,请参考以下文章

mingw g ++以错误的语言发出警告(德语而不是英语)

在构建导出包含ATL :: CString成员的类的DLL时发出警告C4251

SSE 半负载 (_mm_loadh_pi / _mm_loadl_pi) 发出警告

单击 React 时发出警报警告

使用 -Wall 编译 c++ - 来自其他文件的警告

Swift 2.0 并发出警告