C语言输出' '换行时异常?斐波那契数列输出问题求助
斐波那契数列输出异常原因分析
你的问题核心是int类型溢出导致输出包含控制字符,干扰终端显示。
具体细节:
- 绝大多数系统中,
int是32位有符号整数,最大值为2147483647;少数老环境下int是16位,最大值仅32767。 - 斐波那契数列增长极快,当N达到一定值时(16位int下N≥25,32位int下N≥47),计算出的数值会超出
int的存储范围,触发整数溢出。 - 溢出后的数据会按补码规则循环,变成负数或无意义的奇怪数值,这些数值中可能包含终端控制字符(比如
\r回车、\b退格等不可见字符)。 - 当你用
printf("%d\n", ...)输出这些带控制字符的数值时,终端会执行这些控制指令,导致光标位置错乱,出现首行无数字、内容错位、行尾无换行等异常。 - 而用空格代替换行时,即使输出负数,也只是显示普通字符,不会触发终端控制指令,所以看起来输出正常。
验证方法:
你可以在循环里额外打印数值的十六进制形式,直观查看溢出后的结果:
printf("%d (0x%x)\n", fib_number[i], fib_number[i]);
如果看到类似0xffffxxxx的结果,就说明确实是溢出导致的负数,部分十六进制值对应的ASCII字符就是终端控制符。
解决办法:
把存储斐波那契数的类型换成更大的整数类型,比如long long(64位有符号整数,最大值9223372036854775807,足够存储前90项左右的斐波那契数)。修改后的代码如下:
#include <stdio.h> #define N 40 int main(void) { long long fib_number[N] = { 0, 1 }; printf("%lld\n%lld\n", 0LL, 1LL); for (int i = 2; i < N; i++) { fib_number[i] = fib_number[i - 2] + fib_number[i - 1]; printf("%lld\n", fib_number[i]); } return 0; }
内容的提问来源于stack exchange,提问作者qopm
相关产品推荐
相关产品推荐

