You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:33:19