2011-08-23 57 views
0

我是编程和计算的新手。指令数目不正确并且移出int范围

我正在运行一个基于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元素子集的总数。我插入了这条语句,看看是否有趣的事情发生了,事实上的确如此。

  1. 输电超过数学预期值。我的计算错了吗?
  2. 输出在一段时间后变为负值,因为它超出了整数范围,但它不应该。在结束

样品输出,其中我手动打破

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

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

+0

要扩展数字变量的范围,请将其从“int”更改为“unsigned int”。 'unsigned'表示该数字永远不会为负数,因此可以使用该额外容量来存储更高的正值。如果你需要一个更大的数字并且你的编译器支持它,你可以使用'unsigned long long',通常(至少)是64位。您可以在这里查看整数类型的常见限制:http://en.wikipedia.org/wiki/Limits.h –

+0

我想我明白了。整数范围将近2 * 10^9,而我的数字要高一个数量级。 – yayu

回答

4

数学我希望它具有值1.9360889031×10^10

1.9360889031×10^10(19360889031)是由一个int比2147483647,表示的最大值大的同意(至少在你的编译器上)。

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

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

+0

他也可以在64位机器上使用'unsigned long long' - fast,在32位机器上合理。 – bdonlan