2012-03-06 86 views
1

所以我的代码程序为什么要这样做? C++

#include <iostream> 
using namespace::std; 
int main() { 
    int a = 1; 
    int b = 1; 
    while (a < 100) { 
     a = a + b; 
     b = a + b; 
     cout << a << endl; 
     cout << b << endl; 
    } 
} 

它能做什么是打印Fibonacci序列高达100但是,当我做“一个”更大,也就是说,(9000!)10十亿,它只是打印出似乎随机数字。它为什么这样做?

+6

[Integer溢出](http://en.wikipedia.org/wiki/Integer_overflow) – Mysticial 2012-03-06 21:40:36

+0

在您的平台上,100亿可能会比'int'更大。你是否尝试过'长',如果C++ 11,'长',? – 2012-03-06 21:41:15

回答

8

,当你超过一个整数的范围(在Windows上可能2,147,483,647 32位),这可能会发生。尝试将类型更改为long long,然后查看您是否可以获得更精确的结果以获得更大的范围。或者,您可以更改添加unsigned的类型,因为fib。序列是严格正向的,所以会使值的范围加倍。

这是依赖于体系结构,但使用范围从http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx,你的范围是:

int: [–2,147,483,648, 2,147,483,647] 
unsigned int: [0, 4,294,967,295] 
long long: [–9,223,372,036,854,775,808, 9,223,372,036,854,775,807] 
unsigned long long: [0, 18,446,744,073,709,551,615] 

编辑:完全偏离主题,但感谢把我在1K你光荣的投票混蛋!

+0

因为他没有使用小数,所以他应该使用类似int64(long long)的东西 – Toby 2012-03-06 21:45:08

+0

@Toby - 好点,编辑。 – prelic 2012-03-06 21:46:48

0

当程序员选择数据类型时,例如int,程序员有责任确保存储的数字符合的数据类型。在典型的机器上,int可以保持高达约21.4亿的价值。如果你仔细研究,你会变得无稽之谈。

0

你使用的一个int这意味着它是一个32 Bit Integer - 现在有一些数学(2^32),我们得出的结论是,你不能保存任何价值超过2,147,483,647更大。

试试long long/int64 - 这应该够了!