दिलचस्प पोस्ट
मल्टीपार्ट / फॉर्म-डेटा में सीमा क्या है? जावा में एक विधि के अंदर कक्षा परिभाषाओं का उपयोग करें स्कैला में जेसनॉन लाइब्रेरी का उपयोग कैसे करें? MySQL स्ट्रिंग की जगह SQL सम्मिलित हों अंतर एक MySQL डाटाबेस में एक्सेल फ़ाइल कैसे आयात करें सीएसएस के साथ लंबी तार काट: संभव अभी तक? वास्तव में "HIERARCHY_REQUEST_ERR: DOM अपवाद 3" का कारण-त्रुटि हो सकता है? मैं AJAX वेबसर्विज पर भेजने के लिए एक JSON ऑब्जेक्ट कैसे बनाऊँ? नेटवर्क उपकरण जो धीमी नेटवर्क कनेक्शन का अनुकरण करते हैं .NET 2.0 रनटाइम पर LINQ फ़ंक्शन के साथ जावास्क्रिप्ट टर्नरी ऑपरेटर का उदाहरण क्या घोषित गुणों के लिए इसी आवृत्ति चर की आवश्यकता होती है? इकट्ठा और कई गतिशील HTML इनपुटों के सबमिट किए गए मूल्यों को वापस सर्वलेट में सहेजें आप एक मैट्रिक्स की पंक्तियों को सदिश में कैसे जोड़ते हैं?

uint8_t को cout के साथ मुद्रित नहीं किया जा सकता

मेरे पास सी ++ में पूर्णांक के साथ काम करने के बारे में एक अजीब समस्या है

मैंने एक साधारण प्रोग्राम लिखा था जो कि एक वैरिएबल के लिए एक मान सेट करता है और फिर उसे प्रिंट करता है, लेकिन यह उम्मीद के मुताबिक काम नहीं कर रहा है

मेरे प्रोग्राम में केवल दो पंक्तियाँ हैं कोड:

uint8_t aa=5; cout<<"value is "<<aa<<endl; 

इस कार्यक्रम का उत्पादन value is

यानी यह aa लिए रिक्त प्रिंट करता है।

जब मैं uint16_t को uint16_t में uint16_t , तो ऊपर का कोड जादू की तरह काम करता है

मैं Ubuntu 12.04 (64 बिट) का उपयोग करता हूं और मेरा कंपाइलर संस्करण है: gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

वेब के समाधान से एकत्रित समाधान "uint8_t को cout के साथ मुद्रित नहीं किया जा सकता"

यह वास्तव में एक रिक्त मुद्रित नहीं करता है, लेकिन सबसे मूल्यवान 5 एएससीआईआई वर्ण, जो कि अदृश्य है। इसमें कई अदृश्य ASCII वर्ण कोड हैं , जिनमें से अधिकतर मूल्य 32 से नीचे हैं, जो वास्तव में रिक्त है

आपको ostream& operator<<(ostream&, unsigned char) दृश्यमान वर्ण मान को आउटपुट करने की कोशिश करता है, इसलिए आपको संख्यात्मक मान आउटपुट करने के लिए unsigned int परिवर्तित करना होगा।

 uint8_t aa=5; cout << "value is " << unsigned(aa) << endl; 

uint8_t सबसे अधिक संभावना unsigned char लिए एक typedef होगा unsigned char वर्ग के पास unsigned char लिए एक विशेष अधिभार है, अर्थात यह चरित्र 5 नंबर के साथ प्रिंट करता है, जो कि छापने योग्य है, इसलिए रिक्त स्थान।

  • एडीएल (तर्क-आधारित नाम लुकअप) का प्रयोग करना:

     #include <cstdint> #include <iostream> #include <typeinfo> namespace numerical_chars { inline std::ostream &operator<<(std::ostream &os, char c) { return std::is_signed<char>::value ? os << static_cast<int>(c) : os << static_cast<unsigned int>(c); } inline std::ostream &operator<<(std::ostream &os, signed char c) { return os << static_cast<int>(c); } inline std::ostream &operator<<(std::ostream &os, unsigned char c) { return os << static_cast<unsigned int>(c); } } int main() { using namespace std; uint8_t i = 42; { cout << i << endl; } { using namespace numerical_chars; cout << i << endl; } } 

    उत्पादन:

     * 42 
  • एक कस्टम स्ट्रीम मैनिपुलेटर भी संभव होगा।

  • यूनरी प्लस ऑपरेटर एक स्वच्छ मुहावर है ( cout << +i << endl )।

इसका कारण यह है कि आउटपुट ऑपरेटर uint8_t uint8_t को char तरह की तरह व्यवहार करता है ( uint8_t आमतौर पर unsigned char लिए सिर्फ एक उपनाम है), इसलिए यह चरित्र को एएससीआईआई कोड (जो कि सबसे आम वर्ण एन्कोडिंग सिस्टम है) के साथ प्रिंट करता है 5

उदाहरण के लिए इस संदर्भ को देखें।

cout एएससीआईआई मूल्य 5 एआर के रूप में इलाज कर रहा है जो कि एक अनियंत्रित वर्ण है, मुद्रण से पहले int को टाइपकास्टिंग करने का प्रयास करें।

किसी भी प्रारंभिक डेटा प्रकार के वेरिएबल से पहले एक अनार + ऑपरेटर को जोड़ना, एएससीआईआई वर्ण के बजाय प्रिंट करने योग्य संख्यात्मक मान देता है (चार प्रकार के मामले में)

 uint8_t aa=5; cout<<"value is "<< +aa <<endl; 

जैसा कि अन्य लोगों ने कहा था कि समस्या से पहले ऐसा होता है क्योंकि मानक स्ट्रीम ने चार अक्षर और अहस्ताक्षरित अक्षर एक एकल अक्षर के रूप में हस्ताक्षर किए हैं, न कि संख्या के रूप में।

न्यूनतम कोड परिवर्तनों के साथ मेरा समाधान यहां है:

 uint8_t aa = 5; cout << "value is " << aa + 0 << endl; 

"+0" जोड़ना किसी भी संख्या के साथ सुरक्षित है जिसमें फ़्लोटिंग बिंदु शामिल है।

पूर्णांक प्रकार के लिए यह आकार के परिणाम प्रकार को बदल देगा, यदि sizeof(aa) < sizeof(int) और यह टाइप बदल नहीं होगा यदि sizeof(aa) >= sizeof(int)

यह समाधान स्ट्रीम करने के लिए int8_t को मुद्रित करने के लिए भी अच्छा है, जबकि कुछ अन्य समाधान इतने अच्छे नहीं हैं:

 int8_t aa = -120; cout << "value is " << aa + 0 << endl; cout << "bad value is " << unsigned(aa) << endl; 

आउटपुट:

 value is -120 bad value is 4294967176 

एपीएल के साथ पीएस समाधान pepper_chico और πάντα ῥε given द्वारा दी गई है वास्तव में सुंदर है

operator<<() अधिभार के बीच अधिभार और char एक गैर सदस्यीय समारोह है। आप स्पष्ट रूप से एक सदस्य के कार्य को एक uint8_t (या एक uint8_t ) को int रूप में उपयोग करने के लिए उपयोग कर सकते हैं

 #include <iostream> #include <cstddef> int main() { uint8_t aa=5; std::cout << "value is "; std::cout.operator<<(aa); std::cout << std::endl; return 0; } 

आउटपुट:

 value is 5