У меня есть очень простая программа, которая преобразует шестнадцатеричную строку в целочисленное значение. Код выглядит нормально, но выдает ошибку времени выполнения:
.вызывается завершение после создания экземпляра 'std::out_of_range' что(): стои
Вот код, в котором возникает ошибка:
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;
}
Я попытался прочитать пару страниц, таких как эта. Я до сих пор не могу найти ничего, что относится к моей проблеме. Что я делаю неправильно, что вызывает эту ошибку?
0xff000000
равно 4278190080. Наибольшее значение, которое может быть сохранено в 32-битном целом числе, равно 2147483647. Если преобразовать это значение в шестнадцатеричное, причина станет очевидной.@SamVarshavchik 32-битные шестнадцатеричные значения со старшим набором битов соответствуют отрицательным целым числам. Вы должны опубликовать ответ, объясняющий, почему
stoi
не преобразует строку, начинающуюся с8
доf
, в отрицательное целое число.@Spencer "32-битные шестнадцатеричные значения с установленным старшим битом соответствуют отрицательным целым числам" - только когда шестнадцатеричный код представляет со знаком целое число. Вместо этого он может представлять беззнаковое целое число. Рассматриваемый код предполагает подписанный, но его можно легко настроить для поддержки беззнакового.
В конце концов, @RemyLebeau stoi возвращает целое число со знаком. Даже если его можно настроить, мы не знаем, интересует ли OP подписанный или неподписанный, и в этом случае вместо этого следует использовать
stoul
. Поэтому на этот вопрос требуется разъяснение от Packa или, по крайней мере, ответ, который охватывает оба случая.Packa: Какой результат вы ожидали получить?
4294705152
, или-262144
, или что-то еще?@NateEldredge 4294705152 был ожидаемым результатом. Все остальные индексы положительные, а не отрицательные.