1

我注意到在我的斐波那契数列中,在某个点之后我得到了负数:

267914296 433494437 701408733 1134903170
1836311903 -1323752223 512559680 -811192543 -298632863 

这是否与“int”的有限范围有关?还是我的代码有问题?

这是代码:

using std::cout;

int main()
{

int n = 50, f1 = 0, f2 = 1, fn = 0, i = 0;

cout << "0 ";
for (i = 0; i < n; i++)
{
    fn = f1 + f2;
    f2 = f1;
    f1 = fn;

    cout << fn << " ";
}
4

3 回答 3

2

我敢打赌它确实与 int 的范围有关。你可能溢出了

一个整数通常有 32 位,其中一位是符号,所以如果你有一个像

01111111111111111111111111111111

有点超过 20 亿,然后你2加到它,然后你得到

10000000000000000000000000000001

这是负数(第一个数字是符号,0是正数,1是负数)

如果要存储更多数字,可以使用长整数。

于 2013-06-24T16:22:23.807 回答
2

是的,这与有限的范围有关int。这称为翻转溢出,其工作原理就像您汽车中的里程表。一旦数字超过其可能的最高值,它就会翻转到其可能的最低值(它int是一个负数)。考虑使用unsigned intor long unsigned int,尽管第二个不一定更长(它取决于平台)。Along double可以容纳更大的数字。如果您想使用任意大的数字(如您所愿),您可以在此问题的答案中找到合适的库。

于 2013-06-24T16:22:47.027 回答
0

尝试使用“long int”而不是“int”。

于 2017-09-05T03:30:59.090 回答