我是C ++的新手,我在这里有一个问题。
我使用int来打印2的前100次幂。我知道结果将超出int变量的范围。我很好奇,因为该程序给出的结果为0. 0如何出来?
提前致谢!
我的代码如下:
#include<iostream>
using namespace std;
void main()
{
int a=1;
unsigned int b=1;
for (int i=1;i<=100;i++)
{
a=2*a;
b=2*b;
}
cout<<"the first 1oo powers of 2 is (using an signed int): "<<a<<endl;
cout<<"the first 1oo powers of 2 is (using an unsigned int): "<<b<<endl;
//The fix
cout<<"Enter a Char to Exit."<<endl;
char theFix;
cin>>theFix;
}
答案 0 :(得分:4)
将无符号整数或正有符号整数乘以2就像向左移1,而0位将从右移。在32次迭代(假设32位整数)之后,整个值将全部为0位。之后,向左移动0将不再改变结果。
答案 1 :(得分:1)
因为您是C ++的新手,您可能不知道计算机如何存储信息。最终,所有整数都被分解为32位二进制数(一堆1&0; s和0&#39; s)。
a = a * 2; // multiplication
a << 1; // left shift
由于二进制数的性质,这两个指令实际上是同义词。
例如,0 ... 000010用二进制表示法== 2用十进制表示法。
所以,
2 * 2 = 4 = 0....000100 4 * 2 = 8 = 0....001000 8 * 2 = 16 = 0....010000
依旧......
由于整数的位数上限为32,因此您将得到一个巨大的数字2 ^ 32 == 1000 .... 000。再次乘以2时,数字再次向左移动,最终得到000 ... 000000 = 0.
所有进一步的乘法0 = 0,以便得出最终结果。
编辑:只想指出这是发生这种确切结果的唯一情况之一。例如,如果您尝试使用数字3,则会看到预期的整数溢出行为。