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

C语言字符串转long int结果异常:数值溢出问题求助

问题:atol转换大整数得到错误负数结果

我的示例代码:

#include <stdio.h>
#include <string.h>
int main () {
    
char *str = "2160000000";
long int evid=0;
evid = atol(str);
printf("%s = str\n",str);
printf("%ld = ev_id",evid);
   return(0);
}

输出结果:

2160000000 = str
-2134967296 = ev_id

我知道字符串str的值2160000000超出了int类型范围,所以用long int存储转换结果,但调用atol()后得到错误的负数,请问哪里错了?


解答

核心问题是32位系统下long int的取值范围不足以容纳2160000000:

  • 32位有符号整数(包括long int)的最大值是2^31 - 1 = 2147483647,而2160000000已经超过这个上限
  • atol()转换时发生有符号整数溢出,C标准中这属于未定义行为,实际运行时通常会按补码循环截断,最终得到负数结果

解决方法

  1. 使用更大范围的整数类型long long,它在多数平台是64位,最大值可达9223372036854775807,完全能容纳2160000000
  2. 搭配对应的转换函数atoll()(注意是两个小写L),而不是atol()
  3. 输出时要用%lld格式符对应long long类型

修改后的代码:

#include <stdio.h>
#include <stdlib.h>  // atoll()定义在stdlib.h中,原代码的string.h未被使用可移除

int main () {
    char *str = "2160000000";
    long long evid = 0;
    evid = atoll(str);
    printf("%s = str\n", str);
    printf("%lld = ev_id\n", evid);
    return 0;
}

修改后输出会正确显示:

2160000000 = str
2160000000 = ev_id

另外补充:原代码中包含的string.h没有被用到,可以移除,避免冗余。


内容的提问来源于stack exchange,提问作者Vimal Bhaskar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:17:12