在循环的最后一次迭代中,结果是错误的。我知道在减法数字之前可以大于长数。这就是为什么我把力量设定得很久。最后一次迭代的结果应该是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;
}
答案 0 :(得分:3)
中间值(除以9之前)溢出64位整数。这就是为什么你没有得到预期的结果。
更准确地说,64位整数的最大值是:
18446744073709551615
与分割前的(最小)中间值相比:
161000000000000000001
这个答案假设您的代码中的long
类型转换为64位整数类型(标准要求long
类型至少为32位,因此您可能也会得到32-位积分型取决于环境)。根据操作系统,计算机体系结构和编译器的不同,long
类型的上限可能会有所不同。