我正在尝试学习C,我正在努力查看这个简单程序中的错误:
// variable length arrays.
#include <stdio.h>
int main (void)
{
int i, numFibs;
printf ("How many Fibonacci numbers do you want (between 1 and 75)? ");
scanf ("%i", &numFibs);
if (numFibs < 1 || numFibs > 75) {
printf ("Bad number, sorry!\n");
return 1;
}
unsigned long long int Fibonacci[numFibs];
Fibonacci[0] = 0;
Fibonacci[1] = 1;
for (i = 2; i < numFibs; ++i)
Fibonacci[i] = Fibonacci[i-2] + Fibonacci[i-1];
for (i = 0; i < numFibs; ++i)
printf ("%i %llu\n", i, Fibonacci[i]);
printf ("\n");
return 0;
}
该程序来自教科书“C编程”。
为什么会产生错误的序列:
How many Fibonacci numbers do you want (between 1 and 75)? 70
//删除了一些。
31 1346269
32 2178309
33 3524578
34 5702887
35 9227465
36 14930352
37 24157817
38 39088169
39 63245986
40 102334155
41 165580141
42 267914296
43 433494437
44 701408733
45 1134903170
46 1836311903
47 2971215073
48 512559680
49 3483774753
50 3996334433
51 3185141890
52 2886509027
53 1776683621
它开始出错了。根据{{3}},48应该是4807526976。
我认为它可能会溢出?但是这本书没有对此发出警告。嗯...
答案 0 :(得分:1)
原因:它溢出。
请注意4807526976 - 512559680 = 4294967296 = 2^32
,在您的平台上相信类型unsigned long long
是32位而不是64位。
解决方案:尝试使用较大的整数类型,例如int64_t
(您可能需要包含stdint.h
)或维护自己的高精度数据类型。
有关整数溢出的详细信息,请参阅http://en.wikipedia.org/wiki/Integer_overflow