C işaretli tamsayı için onaltılık dize dönüştürmek
C 32 bitlik imzalı tamsayı için onaltılık bir dize dönüştürmek istiyorum .
Örneğin, onaltılık dize var "". fffefffe Bu ikili gösterimini 11111111111111101111111111111110. Bu imzalı tamsayı gösterimi: -65538.
Nasıl C bu dönüşüm yapabilirim ? Bu da negatif olmayan sayılar için çalışması gerekiyor. Örneğin, onaltılık dize "", ikili 00000000000000000000000000001010 olan ve 10 ondalık. 0000000A
CEVAP
std::stringstream kullanın
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
aşağıdaki örnek, sonuç olarak -65538 üretir:
#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;
}
DÜZENLEME:C 11 güncelleştirin. Yeni standart, yararlanabilir birkaç yeni programı bir işlevi vardır! özellikle, bir aile "dizi string" fonksiyonları (http://en.cppreference.com/w/cpp/string/basic_string/stol http://en.cppreference.com/w/cpp/string/basic_string/stoul). Bu C dönüşüm fonksiyonları numara, ama std::string ile başa çıkmak için nasıl bilmek dize etrafında aslında ince sargı vardır
Bu yüzden, yeni kodunu en basit cevap, muhtemelen bu gibi görünecektir:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
NOT:Aşağıda düzen olarak tam bir cevap değil diyor benim orijinal cevap. İşlevsel bir çözüm. Çizgi üstü kod sopa :-).
DÜZENLEME:lexical_cast<> stream dönüştürme semantiği için tanımlanan yana görünüyor. Ne yazık ki, dere "0" gösterimde. anlamıyorum boost::lexical_cast ve elimi hem de hex dizeleri ile bir anlaşma yok yuvarlandı. El ile giriş akışı hex ayarlayan yukarıdaki çözüm gayet iyi idare edecektir.
Bazı güzel hata da kontrol yetenekleri vardır ki bu da, Boost has some stuff. Bu gibi kullanabilirsiniz:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Eğer boost kullanarak gibi hissetmiyorum bile, burada hata denetimi yapar hangi sözcük dökme hafif bir versiyon
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
bu gibi kullanabilirsiniz:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");

Hızlı dize PHP bir tamsayı dönüştürmek...
Android için bir tamsayı bir dize dönü...
Nasıl dize için bir tamsayı değeri dön...
Nasıl Ruby ikili dize veya tamsayı dön...
Nasıl Android hex bir Dize için renkli...