2013-02-01 102 views
32
#include <iostream> 

using namespace std; 

int main() 
{ 
    char   c1 = 0xab; 
    signed char c2 = 0xcd; 
    unsigned char c3 = 0xef; 

    cout << hex; 
    cout << c1 << endl; 
    cout << c2 << endl; 
    cout << c3 << endl; 
} 

मैं उत्पादन की उम्मीद इस प्रकार हैं:एक चरित्र को कोउट के माध्यम से एक पूर्णांक के रूप में कैसे आउटपुट करें?

ab 
cd 
ef 

फिर भी, मैं कुछ भी नहीं मिला है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि कोउट हमेशा 'चार', 'हस्ताक्षरित चार' और 'हस्ताक्षरित चार' को 8-बिट पूर्णांक के बजाय वर्णों के रूप में मानता है। हालांकि, 'चार', 'हस्ताक्षरित चार', और 'हस्ताक्षरित चार' सभी अभिन्न प्रकार हैं।

तो मेरा सवाल है: कैसे एक चरित्र को कोउट के माध्यम से एक पूर्णांक के रूप में आउटपुट करने के लिए?

पीएस: static_cast (...) बदसूरत है और अतिरिक्त बिट्स को ट्रिम करने के लिए और अधिक काम की आवश्यकता है।

+0

afaik, कास्टिंग है ... (जैसे 'static_cast ()') – Nim

+0

'int' करने के लिए इसे कास्टिंग? –

+1

बीटीडब्ल्यू। "ट्रिमिंग" का सहारा लेने का एकमात्र कारण यह है कि आप स्पष्ट रूप से प्रकारों का सही ढंग से उपयोग नहीं कर रहे हैं (पहले दो * स्पष्ट * अतिप्रवाह) और परिणामस्वरूप आपको यही मिलता है। यदि आप हमेशा सही प्रकार का उपयोग करते हैं, तो कास्ट बस है, 'static_cast (...) '... – Nim

उत्तर

65
char a = 0xab; 
cout << +a; // promotes a to a type printable as a number, regardless of type. 

यह रूप में लंबे समय के रूप में प्रकार साधारण अर्थ विज्ञान के साथ एक एकल + ऑपरेटर प्रदान करता है काम करता है। यदि आप एक वर्ग को परिभाषित कर रहे हैं जो एक संख्या का प्रतिनिधित्व करता है, तो कैनोनिकल सेमेन्टिक्स के साथ एक यूनरी + ऑपरेटर प्रदान करने के लिए, operator+() बनाएं जो कि *this या तो मूल्य या संदर्भ-से-कॉन्स्ट द्वारा देता है।

स्रोत: Parashift.com - How can I print a char as a number? How can I print a char* so the output shows the pointer's numeric value? सबसे प्रभावी तरीका

+1

कार्य लिंक: http://www.cs.technion.ac.il/users/yechiel /c++-faq/print-char-or-ptr-as-number.html – GetFree

+1

यह बदतर है। [Sheu के उत्तर] में एक सरल 'static_cast') (https://stackoverflow.com/a/14644745/1557062) स्पष्ट रूप से इरादा व्यक्त करता है। – sigy

7

, एक पूर्णांक प्रकार के लिए उन्हें कास्ट (और उचित रूप से bitmask!) यानी .:

#include <iostream> 

using namespace std; 

int main() 
{ 
    char   c1 = 0xab; 
    signed char c2 = 0xcd; 
    unsigned char c3 = 0xef; 

    cout << hex; 
    cout << (static_cast<int>(c1) & 0xFF) << endl; 
    cout << (static_cast<int>(c2) & 0xFF) << endl; 
    cout << (static_cast<unsigned int>(c3) & 0xFF) << endl; 
} 
+2

और 'c1' और' c2' का आउटपुट 'ffffffab' और' ffffffcd' है, जो ओपी अपेक्षित है _not_ है। –

+0

@ श्री सी 64 अच्छा बिंदु। संपादित, धन्यवाद। – sheu

+0

हालांकि, 'चार', 'हस्ताक्षरित चार', और 'हस्ताक्षरित चार' सभी अभिन्न प्रकार हैं। static_cast (...) बदसूरत है और अतिरिक्त बिट्स को ट्रिम करने के लिए और अधिक काम की ज़रूरत है। – xmllmx

3

हो सकता है कि यह:

आशा है कि यह मदद करता है।