використання std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
наступний приклад дає -65538
результат:
#include <sstream>
#include <iostream>
int main() {
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
// output it as a signed type
std::cout << static_cast<int>(x) << std::endl;
}
У новому стандарті C ++ 11 є кілька нових функцій утиліти, якими ви можете скористатися! конкретно, існує сімейство функцій "рядок до числа" ( http://en.cppreference.com/w/cpp/string/basic_string/stol та http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Це по суті тонкі обгортки навколо рядка С в функції перетворення чисел, але знають, як боротися з astd::string
Отже, найпростіша відповідь на новіший код, мабуть, виглядатиме так:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
ПРИМІТКА. Нижче наведена моя оригінальна відповідь, яка, як каже редакція, не є повною відповіддю. Для функціонального рішення дотримуйтесь код над рядком :-).
Здається, що оскільки lexical_cast<>
визначено, має семантику перетворення потоку. На жаль, потоки не розуміють позначення "0x". Тож boost::lexical_cast
і моя, і моя ручна рука не дуже добре справляються зі шістнадцятковими струнами. Вищеописане рішення, яке вручну встановлює вхідний потік на шестигранний, справляється з ним просто чудово.
Boost має також деякі речі для цього, що також має деякі приємні можливості перевірки помилок. Ви можете використовувати його так:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Якщо ви не хочете використовувати boost, ось легка версія лексичного актора, яка не перевіряє помилок:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
який ви можете використовувати так:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");