用unit64_t左移-发出警告

时间:2018-08-26 04:36:50

标签: c++

我正在尝试执行以下操作。但是我不确定哪里可能出问题了

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

我明白了

  

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

我得到的输出为0。我期望像这样的二进制文件的十进制输出

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

1是32位常量。编译器(正确地)将常量表达式计算为0 ---与int32大小相等的1移位的边界。如果<<的参数是变量,则x86 cpu将返回(1 << 14),即1 <<(46%32)。 尝试“ 1ULL << 46”。