У меня есть 8-символьная строка
, представляющая шестнадцатеричное число, и мне нужно преобразовать ее в int
. Это преобразование должно сохранить битовый шаблон для строк , «80000000»
и выше, т.е. эти числа должны быть отрицательными. К сожалению, наивное решение:
int hex_str_to_int(const string hexStr)
{
stringstream strm;
strm << hex << hexStr;
unsigned int val = 0;
strm >> val;
return static_cast<int>(val);
}
не работает для моего компилятора, если val> MAX_INT
(возвращаемое значение - 0). Изменение типа val на int
также приводит к 0 для больших чисел. Я пробовал несколько разных решений из разных ответов здесь, на SO, и еще не добился успеха.
Вот что я знаю:
sizeof (int)
будет как минимум 4 на каждой архитектуре, на которой будет работать мой код. long
к int
приводит к INT_MAX
, когда значение слишком велико. Это на удивление сложно сделать правильно, по крайней мере, для меня. Кто-нибудь знает о портативном решении этой проблемы?
Обновление:
Изменение static_cast
на reinterpret_cast
приводит к ошибке компилятора.Комментарий побудил меня попробовать приведение в стиле C: return (int) val
в приведенном выше коде, и это сработало. На этой машине. Будет ли это безопасно на других архитектурах?