为什么std :: stoul会转换负数?

时间:2013-10-11 21:53:49

标签: c++ c++11

http://ideone.com/RdINqa所示,std::stoul不会为负数抛出std::out_of_range,而是将它们包裹起来。为什么是这样?似乎-4超出了unsigned long类型的范围,所以它应该抛出。

1 个答案:

答案 0 :(得分:12)

  

21.5 数字转换

     

unsigned long stoul(const string& str, size_t *idx = 0, int base = 10);

     

效果: ...调用[s] strtoul(str.c_str(), ptr, base) ...返回已转换的结果(如果有)。

     

如果转换后的值超出了返回类型的可表示值范围,则抛出: ... out_of_range

“转换后的值”这里是strtoul返回的值。当然,其类型为unsigned long,因此不能超出stoul的返回类型的可表示值范围,也是unsigned long

据我所知,只有stoi可以抛出out_of_range,因为它会返回int,但会使用返回strtol的{​​{1}}。

此外,C标准指定long的方式,需要接受字符串strtoul并返回等于"-4"的值。为什么用这种方式指定,我不知道。