我正在尝试执行以下操作。但是我不确定哪里可能出问题了
uint64_t x = (1 << 46);
std::cout << x;
我明白了
-警告:左移计数> = [-Wshift-count-overflow]类型的宽度
我得到的输出为0。我期望像这样的二进制文件的十进制输出
1 0000........00 (46 0s)
我的问题是为什么我会收到此警告?不是uint64_t 64位吗?还有为什么我得到的输出为0?
答案 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”。