我正在做两个涉及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
答案 0 :(得分:24)
简单的答案是使用strtoul()
代替。
更长的答案是,即使您需要的所有内容都是32位整数或对未签名的31位感到满意,atoi()
函数也不适合您的工作。
正如您已经指出的那样,atoi()
函数将字符串转换为整数。一个普通的有符号整数。但是,atoi()
不做的是错误处理。 atoi()
的规范说的是“如果无法表示该值,则行为未定义。”
strto *()系列函数都清楚地指明了错误的处理方式,所以你应该在所有情况下用调用atoi()
替换strtol()
(将字符串转换为long),在这种情况下既然你想处理无符号整数,你应该使用strtoul()
(将字符串转换为无符号长整数)。
另请注意,如果要处理更大的数字,可以使用strtoll()
和strtoull()
函数将字符串转换为long long或unsigned long long。 (如果你只是想处理最大可能的积分值而不打扰它们之间的所有内容,那就是strtoimax()
和strtoumax()
,它返回intmax_t
或{{1}类型的值分别。)
POSIX文档:
答案 1 :(得分:2)
根据您的平台,strtoul可能是您想要的:
strtoul()函数在nptr中转换字符串的初始部分 根据给定的基数,无符号的long int值,必须 在2到36之间,或者是特殊值0。