SORU
1 Temmuz 2009, ÇARŞAMBA


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
1 Temmuz 2009, ÇARŞAMBA


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"); 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CNET

    CNET

    5 Mayıs 2006
  • KendrickLamarVEVO

    KendrickLama

    9 ŞUBAT 2011
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008