我有一个非常简单的程序,将十六进制字符串转换为它的整型值。代码看起来很好,但是它抛出了一个运行时错误:
抛出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]
,将以带负号的有符号整数的方式打印出来。所以这似乎不是你想要的。