我是编程和计算的新手。
我正在运行一个基于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语句,看看是否发生了一些有趣的事情,事实确实如此。
我手动断开的末尾的示例输出
Number of Instructions: -2078590001
Number of Instructions: -2078580001
Number of Instructions: -2078570001
Number of Instructions: -2078560001
我发现Int的范围是2147483647,但我做了计算并得出结论,我的k应该永远不会超过限制。那么问题出在哪里?
答案 0 :(得分:4)
数学上我希望它同意值1.9360889031×10 ^ 10
1.9360889031×10 ^ 10(19,360,889,031)大于2,147,483,647,最大值可由int
表示(至少在您的编译器上)。
输出在一段时间后变为负值,因为它超过了int范围,但它不应该。
您可以使用unsigned int
,当计算产生的值太大而无法表示时(或负值),它会正确地“翻转”。当您溢出int
时,您会得到未定义的行为。