【问题标题】:Converting String to Hex Throws Error: 'std::out_of_range'将字符串转换为十六进制引发错误:'std::out_of_range'
【发布时间】:2021-10-12 17:42:00
【问题描述】:

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

在抛出 '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;
}

我尝试阅读了几页,例如this。我仍然找不到与我的问题相关的任何内容。我做错了什么导致此错误?

【问题讨论】:

  • 0xff000000 是 4278190080。可以存储在 32 位整数中的最大值是 2147483647。如果将此值转换为十六进制,原因应该会很明显。
  • @SamVarshavchik 设置了最高位的 32 位十六进制值对应于负整数。您应该发布一个答案,解释为什么 stoi 不会将以 8f 开头的字符串转换为负整数。
  • @Spencer "设置最高位的 32 位十六进制值对应于负整数" - 仅当十六进制表示 有符号 整数时。它可以表示一个 unsigned 整数。有问题的代码假定已签名,但可以轻松调整以支持未签名的代码。
  • 毕竟,@RemyLebeau stoi 返回一个有符号整数。即使可以对其进行调整,我们也不知道 OP 是否对签名或未签名感兴趣,在这种情况下应该使用 stoul 代替。因此,这个问题需要 Packa 的澄清,或者至少涵盖这两种情况的答案。
  • Packa:你期望得到什么输出? 4294705152,或-262144,还是别的什么?

标签: c++ integer hex


【解决方案1】:

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

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

(如果切换到stoul,但将dump保留为int的数组,则该值将通过赋值转换为int。在C++20下,以及对于早期版本的大多数常见系统C++ 标准,转换将“环绕”到-262144,并输出dump[i]&lt;&lt; 将以这种方式打印出来,作为带减号的有符号整数。所以这似乎不是什么你想要的。)

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 2018-01-22
    • 1970-01-01
    • 2013-02-07
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多