未正确提交并移出int范围的指令数

时间:2011-08-23 03:44:34

标签: c++

我是编程和计算的新手。

我正在运行一个基于C ++的程序,在这台机器上花费大约6个小时。我使用我工作的framework的计时工具。

我尝试通过一个简单的程序计算嵌套循环的迭代总数:

{
int k=0;
for (int i = 0; i < 196779; i++)
for (int j= i+1; j< 196779; j++)
{
k++;
if((k+1)%10000 == 0)
cout<< "\n Number of Instructions: " << k;
}
cout<< "\n Total Number of iterations = " << k << endl;
}

在数学上我希望它agree with的值为1.9360889031×10 ^ 10,这是2元素子集的总数。我插入了那个cout语句,看看是否发生了一些有趣的事情,事实确实如此。

  1. 输出超出数学预期值。我的计算错了吗?
  2. 一段时间后输出变为负值,因为它超出了int范围,但不应该。
  3. 我手动断开的末尾的示例输出

    Number of Instructions: -2078590001
     Number of Instructions: -2078580001
     Number of Instructions: -2078570001
     Number of Instructions: -2078560001
    

    我发现Int的范围是2147483647,但我做了计算并得出结论,我的k应该永远不会超过限制。那么问题出在哪里?

1 个答案:

答案 0 :(得分:4)

  

数学上我希望它同意值1.9360889031×10 ^ 10

1.9360889031×10 ^ 10(19,360,889,031)大于2,147,483,647,最大值可由int表示(至少在您的编译器上)。

  

输出在一段时间后变为负值,因为它超过了int范围,但它不应该。

您可以使用unsigned int,当计算产生的值太大而无法表示时(或负值),它会正确地“翻转”。当您溢出int时,您会得到未定义的行为。