2012-03-06 85 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 - 這應該夠了!