问题 为什么std :: stoul转换为负数?


如图所示 http://ideone.com/RdINqastd::stoul 不投掷 std::out_of_range 对于负数,但包裹它们。为什么是这样?似乎-4超出了该类型的范围 unsigned long 所以它应该抛出。


10991
2017-10-11 21:53


起源



答案:


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 返回 long

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


12
2017-10-11 22:13



谢谢,这很烦人 - Kal


答案:


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 返回 long

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


12
2017-10-11 22:13



谢谢,这很烦人 - Kal