gpt4 book ai didi

c++ - 为什么将无符号数左移 32 次不会产生零?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:44 27 4
gpt4 key购买 nike

#include <iostream>

using namespace std;

int main()
{
cout << "sizeof(unsigned int): " << sizeof(unsigned int) << endl;
unsigned a = 1;
int i = 0;
while (a) {
cout << "a[" << i++ << "]: " << a << endl;
a <<= 1;
}

cout << "a[" << i << "]: " << a << endl;

unsigned b = 1;
unsigned c = (b << 31);
unsigned d = (b << 32);

cout << "c: " << c << endl;
cout << "d: " << d << endl;

return 0;
}

/* 输出http://www.compileonline.com/compile_cpp_online.php */

Compiling the source code....
$g++ main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1
main.cpp: In function 'int main()':
main.cpp:19:23: warning: left shift count >= width of type [enabled by default]

Executing the program....
$demo

sizeof(unsigned int): 4
a[0]: 1
a[1]: 2
a[2]: 4
a[3]: 8
a[4]: 16
a[5]: 32
a[6]: 64
a[7]: 128
a[8]: 256
a[9]: 512
a[10]: 1024
a[11]: 2048
a[12]: 4096
a[13]: 8192
a[14]: 16384
a[15]: 32768
a[16]: 65536
a[17]: 131072
a[18]: 262144
a[19]: 524288
a[20]: 1048576
a[21]: 2097152
a[22]: 4194304
a[23]: 8388608
a[24]: 16777216
a[25]: 33554432
a[26]: 67108864
a[27]: 134217728
a[28]: 268435456
a[29]: 536870912
a[30]: 1073741824
a[31]: 2147483648
a[32]: 0
c: 2147483648
d: 1

问题> 如您所见,a[32 等于 0。现在为什么 d 不是 0 而是 1?

最佳答案

这是 C/C++ 中的未定义行为。

标准特别对此未定义,因为不同的 CPU 在出现这种转变时会做不同的事情。具体来说,在 32 位 Intel 上,我相信只有移位量的低 5 位被 CPU 使用,其余位被忽略。如果我没记错的话,PowerPC 和 64 位 Intel 都使用低 6 位而忽略其余部分。

高级语言可能会尝试通过更正结果使其在逻辑上更加一致来解决这个问题,但是像 C/C++ 这样的低级语言被设计为“接近金属”并且会想要生成一个单一的<< 的移位指令运营商。

关于c++ - 为什么将无符号数左移 32 次不会产生零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790923/

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