【发布时间】:2014-04-07 06:03:38
【问题描述】:
我有这个代码。
#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 桥架构上。
第一个结果是有道理的,但我不明白第二个数字是从哪里来的。 1 表示为 4byte int 有符号或无符号是
00000000000000000000000000000001
当你将它向左移动 31 次时,你会得到
10000000000000000000000000000000
不是吗?我知道正数左移本质上是 2^k,其中 k 是你移动它的次数,假设它仍然在范围内。为什么我会得到这么奇怪的数字?
【问题讨论】:
-
bizarre number?检查二进制形式
-
我说的是第二行。更新了问题。