我一直在用Java艺术与科学第4章练习10中的练习4.10程序进行开发。这是我的代码:
import acm.program.*;
public class FibonacciSequenceModified extends ConsoleProgram{
public void run(){
println("This program will display the numbers of the fibonacci sequence that are less than " +
"10,000");
int total=0;
int x=0;
int y=1;
println("F0= "+ x);
println("F1= "+ y);
for (int num=2; num<=100; num++){
total=x+y;
if (total<10000){
println("F" + num +"= " +total);
x=y;
y=total;
}
}
}
}
该程序将运行,并且F20 = 6765是其最后一行。但是,如果我修改了代码,以使第一个大括号“}”现在位于x = y之前;而不是在y = total;之后,该程序变得笨拙,并且将显示超过F20 = 6765的巨大负数。谁能给我解释一下此简单更改所导致的代码意图?
最佳答案
大括号表示if
块的末尾,这可以防止到达10000
后对斐波那契数进行计数的循环。之所以需要这样做,是因为斐波那契数呈指数增长,最终对于一个简单的32位int而言太大了。
发生的是interger溢出。这意味着您的int太大,以至于它们不能容纳32位。
例如,考虑最大的32位有符号整数:2,147,483,647
01111111111111111111111111111111
如果您添加1,它将变为:
10000000000000000000000000000000
那是最小的负整数:2,147,483,648。您的数字远远超出了。这就是为什么您看到底片
如果继续“添加”,最终将导致以下结果:
11111111111111111111111111111111
在Two's compliment表示中为-1。如果你加1,你会得到这个
100000000000000000000000000000000
您可能会注意到,那里有超过32位。最高有效位(1)将被截断,我们回到0。
00000000000000000000000000000000
您的斐波纳契数一直超过这个32位的限制,因为最高有效位被遗漏了,剩余的位不是很有意义,这就是为什么您看到随机数的原因。