2012-01-29 13 views
12

के लिए चार का उपयोग करके मैंने पढ़ा कि कोई छोटे पूर्णांक के लिए "char" का उपयोग कर सकता है। हालांकि, जब मैं कोशिश,छोटे पूर्णांक (सी ++)

unsigned char A = 4; 
std::cout << A << std::endl; 

यह एक चरित्र है, नहीं 4.

+1

आपने इसे कहाँ पढ़ा? वैसे भी, यह हस्ताक्षर किए गए चैट ए = '4' होना चाहिए; और इसे एक वर्ण के रूप में संग्रहीत नहीं किया जाएगा – krammer

+6

चार को इस कलाकार को int में रोकने के लिए अक्षर के रूप में उपयोग किया जाता है: 'std :: cout << (int) ए << std :: endl;' – Nobody

+3

@krammer: it वह क्या चाहता है पर निर्भर करता है और आपका मतलब है कि चार चैट नहीं करते हैं, है ना? – Burkhard

उत्तर

17

क्या आप अनुभव कर रहे ऑपरेटर ओवरलोडिंग का प्रभाव हैं। << ऑपरेटर मानता है कि जब आप इसे char प्रकार के चर को सौंपते हैं तो आप एक चरित्र को मुद्रित करना चाहते हैं, इसलिए यह अभिन्न चर के लिए अपेक्षा से अलग व्यवहार करता है।

Vivek Goel ने सुझाव दिया जैसा कि आप अधिभार आप वास्तव में चाहते हैं का चयन करने के लिए मजबूर कर सकते हैं संकलक:

unsigned char A = 4; 
std::cout << static_cast<unsigned int>(A) << std::endl; 

परिशिष्ट: जब तक आप गंभीर रूप से विवश संसाधनों के साथ एक वातावरण पर काम कर रहे (। Esp छोटे स्मृति) , आप गलत अंत पर अनुकूलित कर रहे हैं। unsigned int पर संचालन, आम तौर पर पर unsigned char तुलना में तेजी से कर रहे हैं क्योंकि आपके प्रोसेसर एकल बाइट को नहीं लाया जा सकता है, लेकिन 4 के कम से कम एक से अधिक हो और अन्य 3 बाइट्स बाहर मुखौटा करना पड़ता है।

4

देता है यह होना चाहिए

unsigned char A = 4; 
    std::cout << (int)A << std::endl; 
4

एक char आईएस एक छोटा पूर्णांक (श्रेणी -127 से +127 के साथ), और यह पूर्णांक के रूप में एक ही पूर्णांक अंकगणितीय के अधीन है।

समस्या, यहां आंतरिक प्रतिनिधित्व (द्विआधारी संख्या -127 से +127 रेंज का प्रतिनिधित्व करने वाली बाइनरी संख्या) के बीच अवधारणा मिश्रण है, जो पारंपरिक रूप से इनपुट और आउटपुट फ़ंक्शंस को " ग्लिफ जिसका एएससीआईआई कोड उस पर किया गया नंबर है ", जबकि पूर्णांक के लिए, बाहरी प्रतिनिधित्व" वर्ण अनुक्रम है जो दशमलव रूप में प्रतिनिधित्व पूर्णांक की तरह पढ़ता है "

इसे संख्या के रूप में प्रिंट करने का सबसे आसान तरीका है, इसे int पर आउटपुट फ़ंक्शन (जैसे cout << int(ch) या जो भी समतुल्य रूपांतरण फ़ॉर्म) देने से पहले इसे परिवर्तित करें

6

एक है operator<<std::ostream और (signed/unsigned) char के लिए ओवरलोड लोड करें जो चरित्र आउटपुट करता है;

std::cout << (int)A << std::endl; 

बहरहाल, यह क्या एक "पुरानी शैली" (अधिक विशेष रूप से सी-शैली) डाली कहा जाता है: उत्पादन चरित्र का पूर्णांक मान करने के लिए, आप एक डाली प्रदर्शन करने की जरूरत है। सी ++ ऑपरेटरों कि के लिए खोज करने के लिए, और अधिक स्पष्ट आसान, और आम तौर पर पसंद कर रहे हैं कास्टिंग है:

std::cout << static_cast<int>(A) << std::endl; 

लेकिन इस टाइप करने के लिए बोझिल है; मुहावरेदार विकल्प + ऑपरेटर है, जो करने के लिए (unsigned) int अपने तर्क को बढ़ावा देता है उपयोग करने के लिए है:

std::cout << +A << std::endl; 

यह आप क्या इस्तेमाल करना चाहिए है।

+1

+1 '+ ए' पदोन्नति के लिए – bitmask

1

एकल वस्तुओं के लिए, कोड आकार में वृद्धि किसी भी भंडारण आकार में कमी को कम करने की संभावना है (ऑब्जेक्ट के बाद स्मृति को संरेखण पैडिंग के लिए आवश्यक हो सकता है)। int का उपयोग करें जब तक कि आपको छोटे पूर्णांक की एक बड़ी श्रृंखला की आवश्यकता न हो।

संबंधित मुद्दे