У меня есть 8-символьный string
, представляющий шестнадцатеричное число, и мне нужно преобразовать его в 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, и пока не добился успеха.
Вот что я знаю:
- Я использую компилятор HP C ++ наOpenVMS (с использованием, как мне кажется, процессора Itanium).
sizeof(int)
будет не менее 4 для каждой архитектуры, на которой будет выполняться мой код. - Преобразование из числа> INT_MAX в intреализации.На моей машине это обычно приводит к 0, но, что интересно, приведение от
long
к int
приводит к INT_MAX
, когда значение слишком велико.
Это удивительно трудно сделать правильно,или, по крайней мере, это было для меня.Кто-нибудь знает решение portable для этого?
Обновление:
Изменение static_cast
на reinterpret_cast
приводит к ошибке компилятора.Комментарий побудил меня попробовать приведение в стиле C: return (int)val
в приведенном выше коде, и это сработало. На этой машине. Будет ли это безопасно на других архитектурах?