[英]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_t
或uintmax_t
类型的值。)
POSIX文档:
根据您的平台, strtoul可能是您想要的:
strtoul()函数根据给定的base将nptr中字符串的初始部分转换为unsigned long int值,该值必须介于2和36之间,或者是特殊值0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.