将字符串转换为十六进制引发错误:'std::out_of_range'



我有一个非常简单的程序,将十六进制字符串转换为它的整型值。代码看起来很好,但是它抛出了一个运行时错误:

抛出std::out_of_range实例后调用终止(): stoi

下面是导致错误的代码:

int dump[4];
string hexCodes[4] = {"fffc0000", "ff0cd044", "ff0000fc", "ff000000"};
for (int i = 0; i < 4; i++)
{
dump[i] = 0;
dump[i] = stoi(hexCodes[i], 0, 16);
cout << dump[i] << endl;
}

我试着读了几页这样的。我仍然找不到任何与我的问题有关的东西。我做错了什么导致这个错误?

stoi将抛出out_of_range,如果该值不在int所能表示的范围内。对于32位的int,数字0xfffc0000(4294705152)不在该范围内,因为它大于2^31-1(2147483647)。因此,抛出异常正是它必须做的。

unsigned可以工作,但是没有stou,所以使用stoul。然后,您可能希望使用unsigned dump[4],因为您知道该值可以用unsigned int表示。(同样,只要它们在您的系统上是32位的。uint32_t可能更安全。)作为奖励,这将确保cout << dump[i]按所需打印出4294705152

(如果您切换到stoul,但保持dump作为int的数组,值将通过赋值转换为int。在c++ 20下,以及在早期c++标准下的大多数常见系统,转换将"围绕"到-262144,然后用<<输出dump[i],将以带负号的有符号整数的方式打印出来。所以这似乎不是你想要的。

相关内容

  • 没有找到相关文章

最新更新