为什么程序会这样做? C ++

时间:2012-03-06 21:39:15

标签: 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;
    }
}

它的作用是将斐波纳契序列打印到100个。但是,当我把“a”变大(比如说,超过9000 !!!)100亿时,它就会打印出看似随机的数字。为什么这样做?

5 个答案:

答案 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)

这称为integer overflow

答案 3 :(得分:0)

当程序员选择数据类型时,例如int,程序员有责任确保适合的数字在该数据类型中。在典型的机器上,int可以容纳最多约21.4亿的价值。如果你重复一遍,你就会胡说八道。

答案 4 :(得分:0)

您正在使用int,这意味着它是32 Bit Integer - 现在有了一些数学(2^32),我们得出的结论是您无法保存大于2,147,483,647的任何值。

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