如果它在C ++中超出范围,将打印出什么值

时间:2014-08-25 15:39:36

标签: c++ visual-c++

我是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;
}

2 个答案:

答案 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,则会看到预期的整数溢出行为。