32位和64位无符号整数的位移

时间:2016-11-17 19:22:13

标签: c++

我对这段代码有疑问:

uint32_t c = 1 << 31;
uint64_t d = 1 << 31;
cout << "c: " << std::bitset<64>(c) << endl;
cout << "d: " << std::bitset<64>(d) << endl;
cout << (c == d ? "equal" : "not equal") << endl;

结果是:

c: 0000000000000000000000000000000010000000000000000000000000000000
d: 1111111111111111111111111111111110000000000000000000000000000000
not equal

是的,我知道'd'的解决方案是使用'1ULL'。但我无法理解为什么当换档为31位时会发生这种情况。我在某处读到了将size-1位移位是安全的,所以如果我写的指令没有'UUL'而且文字'1'是32位长,那么将它移位31位应该是安全的,对吧? 我在这里缺少什么?

此致

YotKay

1 个答案:

答案 0 :(得分:1)

问题是你向左移动的表达式,即常量1,被视为有符号整数。这就是编译器在将结果分配给d之前对执行符号扩展的原因,从而导致您看到的结果。

将后缀U添加到1将解决问题(demo)。

uint64_t d = 1U << 31;