首页 > 解决方案 > 将字符串转换为十六进制引发错误:'std::out_of_range'

问题描述

我有一个非常简单的程序,可以将十六进制字符串转换为它的 int 值。代码看起来不错,但会引发运行时错误:

在抛出 'std::out_of_range' what(): 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;
}

我试过读几页这样。我仍然找不到与我的问题相关的任何内容。我做错了什么导致此错误?

标签: c++integerhex

解决方案


stoiout_of_range如果值不在int可以表示的范围内,将抛出。对于 32 位,数字0xfffc0000(4294705152) 不在该范围内,int因为它大于 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]<<


推荐阅读