为什么std :: stoul会转换负数? [英] Why does std::stoul convert negative numbers?

查看:316
本文介绍了为什么std :: stoul会转换负数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

As shown in http://ideone.com/RdINqa, std::stoul does not throw a std::out_of_range for negative numbers, but wraps them around. Why is this? Seems like -4 is out of the range of the type unsigned long so it should throw.

推荐答案


21.5 数值转换

无符号长stoul(const string& str,size_t * idx = 0,int base =
10);

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

Effects: ...call[s] strtoul(str.c_str(), ptr, base) ... returns the converted result, if any.

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

Throws: ...out_of_range if the converted value is outside the range of representable values for the return type.

转换后的价值是 strtoul 返回的值。当然,它的类型为 unsigned long ,因此对于 stoul的返回类型,不能超出可表示值的范围,它也是 unsigned long

"Converted value" here is the value returned by strtoul. Which, of course, is of type unsigned long and so can't be outside of the range of representable values for the return type of stoul, which is also unsigned long.

据我所知,只有 stoi 可以抛出 out_of_range ,因为它返回 int 但使用 strtol 会返回 long

As far as I can tell, only stoi can throw out_of_range, because it returns int but uses strtol which returns long.

此外,采用C标准指定 strtoul ,则需要接受字符串-4 并返回等于<$ c $的值c>-(无符号长)4 。我不知道为什么要这样指定。

Further, the way C standard specifies strtoul, it is required to accept the string "-4" and return a value equal to -(unsigned long)4. Why it's specified this way, I don't know.

这篇关于为什么std :: stoul会转换负数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆