gpt4 book ai didi

c++ - 32 位和 64 位无符号整数的移位

转载 作者:行者123 更新时间:2023-11-30 05:20:23 31 4
gpt4 key购买 nike

我对这段代码有疑问:

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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com