我一直在用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位的限制,因为最高有效位被遗漏了,剩余的位不是很有意义,这就是为什么您看到随机数的原因。

07-28 02:34
查看更多