所以我有代码
#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;
}
}
它的作用是将斐波纳契序列打印到100个。但是,当我把“a”变大(比如说,超过9000 !!!)100亿时,它就会打印出看似随机的数字。为什么这样做?
答案 0 :(得分:8)
当您超出整数范围(在Windows 32位上可能为2,147,483,647)时,可能会发生这种情况。尝试将类型更改为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你光荣的投票混蛋!
答案 1 :(得分:1)
这里的问题是你的integer values overflow,因为你开始在C ++支持中分配大于int的值。例如,在Microsoft编译器上,largest int value为2,147,483,647。
为了直接支持这一点,您可能需要某种形式的Big Integer library,它可以支持任意大的整数值。
答案 2 :(得分:0)
答案 3 :(得分:0)
当程序员选择数据类型时,例如int
,程序员有责任确保适合的数字在该数据类型中。在典型的机器上,int
可以容纳最多约21.4亿的价值。如果你重复一遍,你就会胡说八道。
答案 4 :(得分:0)
您正在使用int
,这意味着它是32 Bit Integer
- 现在有了一些数学(2^32
),我们得出的结论是您无法保存大于2,147,483,647的任何值。
尝试long long
/ int64
- 这应该足够了!