C语言中输出数字的限制是什么?斐波那契数列计算异常解析
问题根源:int类型的整数溢出限制
你遇到的异常是整数溢出导致的——C语言里的int类型有固定取值范围,通常是 -2147483648 到 2147483647(取决于编译器和系统,一般为32位有符号整数)。
斐波那契数列增长速度极快:第30项是832040,还在int范围内;但第46项会达到1836311903,接近int的上限;第47项为2971215073,直接超出int最大值。这时候int变量存不下这个数,就会发生溢出——溢出后的数值会按补码规则循环,变成负数或无意义的乱码,也就是你看到的异常输出。
你的代码里n和a都是int类型,自然会碰到这个问题。
解决办法
- 改用更大范围的整数类型:比如
long long(64位有符号整数),取值范围是-9223372036854775808到9223372036854775807,能支撑到斐波那契第90项左右。修改后的代码示例:
#include <stdio.h> int main() { int fibo, i; long long n, a; printf("Enter a number: "); scanf("%d", &fibo); n = 1; a = 1; printf("%lld %lld ", n, a); for(i = 3; i <= fibo; i++){ n += a; a = n - a; printf("%lld ", n); } return 0; }
注意输出long long时要使用格式符%lld。
- 如果需要计算更多项:可以用
unsigned long long(无符号64位整数,上限更大),或者自己实现大整数运算(用数组存储每一位数字,手动处理进位)。
内容的提问来源于stack exchange,提问作者Brezendelima
相关产品推荐
相关产品推荐

