Joh*_*ohn 16 c integer-overflow atoi
我正在做两个涉及atoi的操作,我想知道如何使用无符号整数来执行此操作,因为atoi似乎将这些转换为signed会导致循环整数溢出.我想使用32位无符号整数,但atoi有效地将我限制为31位无符号.
if (multiplication_is_safe(atoi(argv[1]),atoi(argv[3])))
{
printf("%s * %s = %u \n", argv[1], argv[3], atoi(argv[1]) * atoi(argv[3]));
return 0;
} else
Run Code Online (Sandbox Code Playgroud)
Thi*_*ame 23
简单的答案是使用strtoul().
更长的答案是,即使您需要的所有内容都是32位整数,或者对于无符号的31位感到满意,该atoi()函数也不适合您的工作.
如您所知,该atoi()函数将字符串转换为整数.一个普通的有符号整数.但是,什么atoi() 不会做的是错误处理.什么atoi()的规范说的是' 如果该值不能表示,该行为是不确定的. ’
strto*()函数系列都清楚地指定了错误的处理方式,所以你应该在所有情况下替换atoi()调用strtol()(将字符串转换为long),在这种情况下,因为你想处理无符号整数,你应该使用strtoul()(转换) string to unsigned long).
另请注意,如果要处理更大的数字,可以使用strtoll()和strtoull()函数将字符串转换为long long或unsigned long long.(如果你只是想处理最大可能的积分值而不打扰它们之间的所有东西,那就是,strtoimax()并且strtoumax(),返回值类型intmax_t或uintmax_t分别.)
POSIX文档: