位移为32个64的无符号整数

问题描述:

我有此片段的代码的一个问题:位移为32个64的无符号整数

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位。我在某处读到可以安全移动大小为1的位,所以如果我写入没有'UUL'的指令并且文字'1'是32位长,那么将它移位31位应该是安全的,对吗? 我在这里错过了什么?

问候

YotKay

+0

对。谢谢! “ – YotKay

+2

”是的,我知道'd'的解决方案是使用'1ULL'。“你知道错了,在这种情况下1U就足够了。 – Slava

的问题是,你左移,即恒定1的表达,被作为一个符号整数处理。这就是为什么编译器在之前执行符号扩展的原因将结果分配给d,导致您看到的结果。

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

uint64_t d = 1U << 31; 
+0

没错。非常感谢! – YotKay