sử dụng std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
ví dụ sau đây tạo ra -65538
kết quả của nó:
#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;
}
Trong tiêu chuẩn C ++ 11 mới, có một vài chức năng tiện ích mới mà bạn có thể sử dụng! cụ thể, có một nhóm các hàm "chuỗi thành số" ( http://en.cppreference.com/w/cpp/opes/basic_opes/stol và http://en.cppreference.com/w/cpp/opes/ basic_ chuỗi / stoul ). Về cơ bản, đây là các hàm bao mỏng xung quanh chuỗi C thành các hàm chuyển đổi số, nhưng biết cách xử lýstd::string
Vì vậy, câu trả lời đơn giản nhất cho mã mới hơn có thể sẽ giống như thế này:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
LƯU Ý: Dưới đây là câu trả lời ban đầu của tôi, như bản chỉnh sửa nói không phải là câu trả lời hoàn chỉnh. Đối với một giải pháp chức năng, dán mã phía trên dòng :-).
Dường như lexical_cast<>
được xác định là có ngữ nghĩa chuyển đổi luồng. Đáng buồn thay, các luồng không hiểu ký hiệu "0x". Vì vậy, cả boost::lexical_cast
tôi và tay tôi đều không xử lý tốt các chuỗi hex. Giải pháp trên mà tự đặt luồng đầu vào thành hex sẽ xử lý tốt.
Boost cũng có một số thứ để làm điều này, trong đó có một số khả năng kiểm tra lỗi tốt. Bạn có thể sử dụng nó như thế này:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Nếu bạn không muốn sử dụng boost, thì đây là phiên bản nhẹ của dàn diễn viên từ vựng không có lỗi kiểm tra:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
mà bạn có thể sử dụng như thế này:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");