为什么程序要这样做?C++
Why does the program do this? 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亿,它似乎只是打印出随机数字。它为什么要这样做?
当您超出整数范围(在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
——这就足够了!
相关文章:
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- FlatBuffers C++ reinterpret_cast访问实际上是未定义的行为吗?这样做实际上可以吗?
- 为什么 arr[i++] 与 arr[i]++ 会这样做?
- ideone.com 为什么要这样做?
- std::字符串 's' 通过 '&s[0]' 转换为字符* - 如何/为什么这样做?
- 函数如何在不这样做的情况下在新线程上运行"as if"?
- 为什么在接受输入后循环退出时不会这样做
- 为什么我不能在未链接的 DLL 上调用方法,但可以这样做?C++
- 如何强制呼吁移动构造函数,为什么要这样做
- 我是否必须锁定我刚刚枚举的向量,或者我只在更改它时才这样做?
- 为什么指针不能指向张贴增量,而可以这样做才能预先递增
- C++子字符串为什么这样做
- 为什么循环结束时不这样做?
- 即使明确要求这样做,在qformlayout中动态创建的Qwidget也没有框架
- C++循环、作用域和堆栈(为什么这样做?
- C++为什么要这样做
- C++循环在 EOF 之后继续运行时这样做
- 从用户应用程序访问环0模式(以及Borland允许这样做的原因)