当传递表示负值的十六进制时,C++stoll抛出超出范围的异常

C++ stoll throws out of range exception when hex representing minus value is passsed

本文关键字:C++stoll 异常 范围 十六进制 表示      更新时间:2023-10-16

我使用的是Visual Studio 2013,我试图使用stoll将表示负值的十六进制格式的字符串writen转换为long-long,但我得到了超出范围的异常。你知道为什么吗?

例如0xFFFFFFFFFFA7E,它是-1410十进制

示例代码:

std::string s = "0xFFFFFFFFFFFFFA7E";
size_t pos;
auto result = std::stoll(s, &pos, 16);

无符号算术(这里甚至没有使用)换行并不意味着0xFFFFFFFFFFA7E是-1410十进制。事实并非如此。

在任何基数下,这都是一个(非常大的)正数:根据我的计算,为18446744073709550000。

这不能由在有符号64位类型中工作的函数来处理,因为有符号的64位类型的最大值为9223372036854775807。

由于size_t是一个无符号64位类型,并且您需要读取一个只适合未符号64位类型的值,因此请使用执行此操作的函数:strtoull