繁体   English   中英

无符号整数的等价atoi

[英]Equivalent of atoi for unsigned integers

我正在做两个涉及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

简单的答案是使用strtoul()代替。

更长的答案是,即使您需要的所有内容都是32位整数,或者对于无符号的31位感到满意, atoi()函数也不适合您的工作。

如您atoi()atoi()函数将字符串转换为整数。 一个普通的有符号整数。 但是, atoi() 没有做的是错误处理。 atoi()的规范说的是“ 如果无法表示值,则行为未定义。

strto *()系列函数都清楚地指定了错误的处理方式,因此在所有情况下都应该用对strtol()调用替换atoi() strtol() (将字符串转换为long),在这种情况下,因为你想要处理无符号整数,你应该使用strtoul() (将字符串转换为unsigned long)。

另请注意,如果要处理更大的数字,可以使用strtoll()strtoull()函数将字符串转换为long long或unsigned long long。 (如果你只想处理最大可能的积分值而不打扰其间的所有东西,那么strtoimax()strtoumax()分别返回intmax_tuintmax_t类型的值。)

POSIX文档:

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

strtoul()函数根据给定的base将nptr中字符串的初始部分转换为unsigned long int值,该值必须介于2和36之间,或者是特殊值0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM