使用 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 位常量:1
是 int
类型的常量,在您的平台上小于 64 位(可能是 32 位;它是实现定义的)。
您可以通过在常量周围使用UINT64_C
宏来解决此问题:
uint64_t x = (UINT64_C(1) << 46);
【讨论】:
宏UINT64_C
是标准 C/C++ 的一部分吗?
@KaiserKatze 是的,它是<cstdint>
的一部分
或者你可以用类型后缀装饰常量:1ull。【参考方案2】:
1 是一个 32 位常量。编译器(正确地)将常量表达式计算为 0 --- 1 超出了 int32 的大小。如果
【讨论】:
移动比类型的宽度更宽是未定义的行为(不是 0) 为什么在 x86 CPU 上使用变量会使其移位 14? @SamiKuhmonen • 未定义的行为可能会做意想不到的事情。在这种情况下,x86 对班次进行模 32。以上是关于使用 unit64_t 左移 - 发出警告的主要内容,如果未能解决你的问题,请参考以下文章
在构建导出包含ATL :: CString成员的类的DLL时发出警告C4251