2013-04-06 77 views
0

在循环结果的最后一次迭代中是错误的。我知道在减法之前数字可以比long长。这就是为什么我把权力设定很久。最后一次迭代的结果应该是17888888888888888889.为什么不是?用长整数长计算错误

const int NR_LEVELS = 18; 
    unsigned long levels[NR_LEVELS]; 
    unsigned long long power = 10; 
    for(unsigned int i = 0; i < NR_LEVELS; i++) { 
    levels[i] = ((i+1)*10*power-(i+2)*power+1)/9; 
    cout << levels[i] << endl; 
    power *= 10; 
    } 
    levels[17] = 17888888888888888889lu; 
    for(unsigned int i = 0; i < NR_LEVELS; i++) { 
    cout << levels[i] << endl; 
    } 

回答

3

中间值(由9分割前)溢出64位整数。这就是你没有得到预期结果的原因。

为了更精确,64位整数的最大值是:

18446744073709551615 

相比分割前的(最小的)中间值:

161000000000000000001 

此答案是假设long键入代码转换为64位整数类型(标准要求long类型至少为32位,因此您可能还会根据环境获得32位整数类型)。根据操作系统,计算机体系结构和编译器的不同,long类型的上限可能有所不同。

+0

aaaarrrrr ...我一整天都知道,但不知何故,我认为long> int并且不能忘记它:C – 2013-04-06 20:34:46

+0

@ lord.didger:代码中也存在类型问题,但即使使用正确的类型,你将无法获得正确的结果。 – nhahtdh 2013-04-06 20:37:40