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