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