我有这段代码。
#include <iostream>
int main()
{
unsigned long int i = 1U << 31;
std::cout << i << std::endl;
unsigned long int uwantsum = 1 << 31;
std::cout << uwantsum << std::endl;
return 0;
}
它打印出来。
2147483648
18446744071562067968
在 Arch Linux 64 位系统下,使用 gcc 编译,采用 Ivy Bridge 架构。
第一个结果有意义,但我不理解第二个数字来自何处。将 1 表示为 4 字节有符号或无符号整数时:
00000000000000000000000000000001
当您将其向左移31次时,最终得到的是
10000000000000000000000000000000
不会吧?我知道对于正数来说向左移位本质上等于2的k次方,其中k是你移位的次数,假设它仍然适合边界。为什么我得到了一个奇怪的数字?