5

我有一种情况,我正在获取命令行参数并使用boost::lexical_cast<unsigned long>(my_param). 我希望 my_param 的负值会导致 lexical_cast 抛出,但相反它会愉快地转换它们,将 -1 变为18446744073709551615. 这看起来很荒谬,因为 unsigned long 的最大值是 2^32-1,它看起来更像是 unsigned long long。

因此,我正在寻找一种更智能的方法将 char * 输入转换为 unsigned long,或者验证我没有接受伪装成大 unsigned long long 的负值。

4

2 回答 2

6

有一个针对您的问题的提升的错误报告,它解释了为什么它会以这种方式运行:

boost::lexical_cast 具有 stringstream 的行为,它使用 std::locale 的 num_get 函数来转换数字。如果我们查看编程语言的 [22.2.2.1.2] — C++(或 [22.2.2.1.2] 工作草案,C++ 编程语言标准),我们会看到 num_get 使用 scanf 的规则进行转换. 而在 C99 标准中 %u 的输入值减号是可选的,因此如果读取的是负数,则不会出现错误,结果将是二进制补码。

还有一个建议的包装解决方法:

https://svn.boost.org/trac/boost/ticket/5494

于 2012-11-02T16:15:50.177 回答
0

这正是按照标准处理负值的方式。他们使用模 2 N算术。这实现了一个方便的技巧:使用 -1 作为某种类型的最大可能无符号值的简写。

如果您不喜欢这种转换,则必须在进行转换之前扫描输入以查找减号。

于 2012-11-02T16:13:52.040 回答