C语言中long int为何无法处理斐波那契数2971215073?
斐波那契数溢出问题分析
问题代码
#include <stdio.h> unsigned long int fibonacci() { static int count = -1; static int f1 = 0; static int f2 = 1; count++; if(count == 0 || count == 1) { return count; } else { int f3 = f1 + f2; f1 = f2; f2 = f3; return f3; } } int main() { int i; for(i = 1; i <= 50; i++) { printf("\n%i: %li", i, fibonacci()); } return 0; }
问题描述
运行上述代码后,第48个斐波那契数输出为-1323752223,但已知第48个斐波那契数实际值为2971215073。查询得知long int可处理超过40亿的数值,为何会出现数值溢出的错误输出?
原因解析
- 内部计算变量先溢出:虽然函数返回值是
unsigned long int,但核心计算用的f1、f2、f3都是int类型(通常为32位有符号整数,最大值仅为2147483647)。当计算到第47个斐波那契数时,数值就已超出int的上限,触发有符号整数溢出(常见表现为补码回绕,数值变为负数)。后续计算基于错误值进行,最终返回的结果自然是错误的,即使转成unsigned long int也无法修正。 - long int范围依赖平台:
long int的位数并非固定为64位。在32位系统中,long int是32位有符号类型,最大值仅为2147483647,远小于2971215073;只有64位系统中的long int才是64位,最大值可达9e18,能覆盖40亿以上的数值。你查询的信息可能针对64位平台,但运行环境可能是32位。 - 格式符与类型不匹配:函数返回
unsigned long int,但printf中使用了%li(对应long int),格式符与变量类型不匹配会导致输出解析错误,进一步加剧数值显示异常。正确的格式符应为%lu,用于匹配unsigned long int类型。
内容的提问来源于stack exchange,提问作者Nebelmonster
相关产品推荐
相关产品推荐

