c++ - 将字符串转换为十六进制引发错误:'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;
}
我试过读几页这样的。我仍然找不到与我的问题相关的任何内容。我做错了什么导致此错误?
解决方案
stoi
out_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]
<<
推荐阅读
- datadog - Datadog 监控器在一个指标自另一指标以来的一段时间内未发生时发出警报
- angular - 在发布请求中使用带有地图的 ForkJoin - 角度 8
- mysql - 如何从 MySQL 中的列中拆分逗号分隔值?
- c++ - 当派生类型本身是模板时,CRTP 无法继承嵌套类型和使用?
- r - 如何清除 Rstudio 中的绘图查看器?
- c++ - 原始操作和运行时间
- python - csv.writer 写单词的每个字符
- javascript - 每次加载 DOM 内容时阻止 JS 函数运行?
- android - 使用 ESC POS - ZIJIANG 58mm - Delphi 10.2 在打印机热敏打印机中生成二维码和打印
- c++ - 源文件中的覆盖函数