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

C语言long int读入大整数时变量值与输入不符问题排查

问题根因

错误出在输入数值的存储类型选型上:

  • 你定义的long int类型有明确的取值上限:32位环境下long int占4字节,能存储的最大正整数为2147483647(共10位);64位环境下long int占8字节,能存储的最大正整数为9223372036854775807(共19位)。你输入的测试值255678919916555247881长度为21位,已经远超long int的可表示范围,触发了有符号整数溢出,这属于C语言标准定义的未定义行为,最终变量n存储的值完全错乱,和输入值不匹配。
  • 当输入值超出%ld格式符对应类型的取值范围时,scanf函数的读取行为本身也是未定义的,不会正确解析全部输入数字,甚至不同的超长输入在溢出后可能得到完全相同的n值,就会出现你观测到的「输入不同内容、输出完全一致」的现象。
修复方法

处理任意长度的数字输入时,不要用固定宽度的整数类型存储,直接将输入作为字符串读入到字符数组中,逐位处理即可,从根源上规避整数长度限制问题。
修正后的参考代码如下:

#include <stdio.h>
#include <string.h>

int main()
{
    char input[1024] = {0};
    scanf("%s", input);
    int len = strlen(input);
    for (int i = 0; i < len; i++) {
        int cur_digit = input[i] - '0';
        printf("%d: ", cur_digit);
        for (int j = 0; j < cur_digit; j++) {
            printf("%d", cur_digit);
        }
        printf("\n");
    }
    return 0;
}

补充:如果一定要用整数类型存储,可使用部分编译器提供的非标准大整数类型(比如GCC支持的__int128),但这类类型没有通用的标准输入输出格式符支持,跨平台兼容性很差,不推荐在这类场景下使用。

内容的提问来源于stack exchange,提问作者Sara.H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:36:16