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标准中这属于未定义行为,实际运行时通常会按补码循环截断,最终得到负数结果
解决方法
- 使用更大范围的整数类型
long long,它在多数平台是64位,最大值可达9223372036854775807,完全能容纳2160000000 - 搭配对应的转换函数
atoll()(注意是两个小写L),而不是atol() - 输出时要用
%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
相关产品推荐
相关产品推荐

