java – 修改Fibonacci序列生成器时出现意外行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 修改Fibonacci序列生成器时出现意外行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1502字,纯文字阅读大概需要3分钟。
内容图文
我一直在玩我的练习4.10的程序,来自Java的艺术和科学第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达到10000之后计算Fibonacci数.它需要这样做的原因是因为Fibonacci数量呈指数增长,并且最终对于存储的简单32位int来说太大了.
发生的事情是整个溢出.这意味着你的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
你的fibbonacci数字保持超过这个32位的限制,因为最重要的位被关闭,剩下的位不是很有意义,这就是你看到随机数字的原因.
内容总结
以上是互联网集市为您收集整理的java – 修改Fibonacci序列生成器时出现意外行为全部内容,希望文章能够帮你解决java – 修改Fibonacci序列生成器时出现意外行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。