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