无符号整数的等价atoi

时间:2014-12-02 22:32:18

标签: 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

2 个答案:

答案 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。