以下C ++程序调用负数为strtoul
的1.由于在任何无符号类型中都没有可表示负数,我原以为这会失败并返回0
If no valid conversion could be performed, a zero value is returned.
但是返回一个大的正数
#include <cstdlib>
#include <iostream>
int main () {
{char s[] = "-1";
for (int b=0; b<17; ++b)
std::cout << "strtoul (unsigned) of " << s
<< " with base arg " << b
<< ": " << strtoul(s,0,b) << std::endl;}
}
为什么strtoul没有失败并且为负数返回0?
答案 0 :(得分:3)
你最好使用cppreference.com documentation它似乎更准确:
如果减号是输入序列的一部分,则为数值 从数字序列计算的数字被否定,就好像是一元减去 在结果类型中,它应用无符号整数环绕规则。
并且如上所述,可选的加号或减号是有效符号
答案 1 :(得分:2)
由于
0
,{ULONG_MAX}
和{ULLONG_MAX}
在错误时返回,因此 成功的有效回报,希望检查的申请 错误情况应将errno
设置为0
,然后调用strtoul()
或strtoull()
,然后检查errno
。
您需要检查errno
。
答案 2 :(得分:0)
来自不同的参考:cppreference.com:
返回值
成功时str的内容对应的整数值。如果 转换值超出相应的返回类型范围 发生错误并返回ULONG_MAX或ULLONG_MAX。如果没有转换 可以执行,返回0。
这显然与cplusplus.com不同