我对这段代码有疑问:
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
,被视为有符号整数。这就是为什么编译器在将结果分配给 d
之前对其执行符号扩展,从而导致您看到的结果。
将后缀 U
添加到 1
将解决问题 ( demo )。
uint64_t d = 1U << 31;
关于c++ - 32 位和 64 位无符号整数的移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663313/