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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:03:22