负数的strtoul

时间:2016-06-07 14:29:13

标签: c++ c string

以下C ++程序调用负数为strtoul的1.由于在任何无符号类型中都没有可表示负数,我原以为这会失败并返回0

  

If no valid conversion could be performed, a zero value is returned.

但是返回一个大的正数

  

If the value read is out of the range of representable values by an unsigned long int, the function returns ULONG_MAX (defined in <climits>), and errno is set to ERANGE.

#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?

3 个答案:

答案 0 :(得分:3)

你最好使用cppreference.com documentation它似乎更准确:

  

如果减号是输入序列的一部分,则为数值   从数字序列计算的数字被否定,就好像是一元减去   在结果类型中,它应用无符号整数环绕规则。

并且如上所述,可选的加号或减号是有效符号

答案 1 :(得分:2)

Per the POSIX standard

  

由于0{ULONG_MAX}{ULLONG_MAX}在错误时返回,因此   成功的有效回报,希望检查的申请   错误情况应将errno设置为0,然后调用strtoul()或   strtoull(),然后检查errno

您需要检查errno

答案 2 :(得分:0)

来自不同的参考:cppreference.com:

  

返回值

     

成功时str的内容对应的整数值。如果   转换值超出相应的返回类型范围   发生错误并返回ULONG_MAX或ULLONG_MAX。如果没有转换   可以执行,返回0。

这显然与cplusplus.com不同