错误计算长整数

时间:2013-04-06 20:22:01

标签: c

在循环的最后一次迭代中,结果是错误的。我知道在减法数字之前可以大于长数。这就是为什么我把力量设定得很久。最后一次迭代的结果应该是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;
  }

1 个答案:

答案 0 :(得分:3)

中间值(除以9之前)溢出64位整数。这就是为什么你没有得到预期的结果。

更准确地说,64位整数的最大值是:

18446744073709551615

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

161000000000000000001

这个答案假设您的代码中的long类型转换为64位整数类型(标准要求long类型至少为32位,因此您可能也会得到32-位积分型取决于环境)。根据操作系统,计算机体系结构和编译器的不同,long类型的上限可能会有所不同。