为何C#中计算93的斐波那契数结果为负数?
斐波那契数出现负数的原因
核心问题:64位有符号整数溢出
你使用的long类型是.NET中的64位有符号整数,它的取值上限是9223372036854775807。第93个斐波那契数的实际值是12200160415121876738,这个数值远超long的最大值,直接导致了整数溢出。
溢出后的环绕行为
计算机用二进制补码存储有符号整数,当数值超出范围时,会自动执行模运算环绕——原本的正数溢出后,最高位会被识别为符号位,结果就变成了负数。你得到的-6246583658587674878就是溢出后环绕的结果。
代码判断逻辑的漏洞
你循环里的if(fib(i) > long.MaxValue)完全起不到终止作用:因为fib(i)的返回值是long类型,溢出后已经变成负数,永远不可能大于long.MaxValue,所以循环会继续执行,直到输出溢出后的错误数值。
你的代码(修正转义符号后)
long fib(long x){ long a = 1; long b = 0; long c = 0; for(int i = 0; i <= x-1; i++) { c=a+b; a=b; b=c; } return c; } for(int i = 0; i < 420; i++) { if(fib(i) > long.MaxValue) break; Console.WriteLine($"fibonacci of {i} is {fib(i)}"); }
内容的提问来源于stack exchange,提问作者Draco Kinerek
相关产品推荐
相关产品推荐

