我正在执行两个涉及 atoi 的操作,我想知道如何使用无符号整数执行此操作,因为 atoi 似乎将它们转换为有符号会导致环绕整数溢出。我想使用 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
简单的答案是改用strtoul()
。
更长的答案是,即使你所需要的只是有符号的 32 位整数,或者对 31 位的无符号感到满意,atoi()
函数也不适合你看起来正在做的事情。
如前所述,atoi()
函数将字符串转换为整数。普通的有符号整数。但是,atoi()
不做的是错误处理。atoi()
的规范说的是">如果值不能被表示,那么行为是未定义的。
strto*(( 系列函数都清楚地指定了如何处理错误,因此在所有情况下都应将 atoi()
替换为对 strtol()
的调用(将字符串转换为 long(,在这种情况下,由于您要处理无符号整数,因此应使用 strtoul()
(将字符串转换为无符号长整型(。
另请注意,如果要处理较大的数字,可以使用strtoll()
和strtoull()
函数将字符串转换为长长或无符号长长。(如果你只想处理尽可能大的整数值,而不用打扰中间的所有东西,有 strtoimax()
和 strtoumax()
,分别返回 intmax_t
或 uintmax_t
类型的值。
POSIX 文档:
-
atoi()
-
strtol()
-
strtoll()
-
strtoul()
-
strtoull()
-
strtoimax()
-
strtoumax()
根据您的平台,strtoul 可能是您想要的:
strtoul(( 函数在 nptr 中转换字符串的初始部分 根据给定的基数到无符号的长整型整数值,该值必须 介于 2 和 36 之间(含 2 和 36(,或者为特殊值 0。