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

Why does the program do this? C++

本文关键字:C++ 这样做 程序 为什么      更新时间:2023-10-16

所以我有代码

#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亿,它似乎只是打印出随机数字。它为什么要这样做?

当您超出整数范围(在Windows 32位上可能为2147483647)时,可能会发生这种情况。尝试将类型更改为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]

编辑:完全偏离主题,但谢谢你让我超过1000,你们这些光荣的投票混蛋!

这里的问题是您的整数值溢出,因为您开始在C++支持中分配大于int的值。例如,在Microsoft编译器上,最大的int值为2147483647。

为了直接支持这一点,您可能需要某种形式的Big Integer库,它为任意大的整数值提供支持。

这被称为整数溢出

当程序员选择一种数据类型(如int)时,程序员有责任确保存储的数字适合该数据类型。在典型的机器上,一台int可以拥有高达21.4亿美元的价值。如果你仔细看,你就会胡说八道。

您使用的是int,这意味着它是32 Bit Integer-现在通过一些数学运算(2^32),我们得出结论,您不能保存任何大于2147483647的值。

试试long long/int64——这就足够了!