C语言 相当于无符号整数的 atoi



我正在执行两个涉及 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_tuintmax_t 类型的值。

POSIX 文档:

  • atoi()
  • strtol()
  • strtoll()
  • strtoul()
  • strtoull()
  • strtoimax()
  • strtoumax()

根据您的平台,strtoul 可能是您想要的:

strtoul(( 函数在 nptr 中转换字符串的初始部分 根据给定的基数到无符号的长整型整数值,该值必须 介于 2 和 36 之间(含 2 和 36(,或者为特殊值 0。

最新更新