2012-12-11 19 views
9

जब भंडारण "बाइट सरणियों के लिए" अहस्ताक्षरित चार (धब्बे ...) यह char या unsigned char आइटम (unsigned char भी कहा जाता है uint8_t) के लिए उपयोग करने के लिए बेहतर है? (मानक कहता है कि sizeof दोनों में से 1 बाइट है।)चार बनाम बाइट सरणियों

क्या इससे कोई फर्क पड़ता है? या एक दूसरे की तुलना में अधिक सुविधाजनक या प्रचलित है? शायद, बूस्ट जैसे पुस्तकालय क्या उपयोग करते हैं?

+2

@nightcracker शायद, क्या आप डुप्लिकेट पर इंगित कर सकते हैं? – Cartesius00

+0

डुस्टे https://stackoverflow.com/questions/653336/ – kebs

उत्तर

10

यदि char हस्ताक्षरित है, तो उच्च बिट सेट के साथ बाइट मान पर अंकगणित करने के परिणामस्वरूप int पर प्रचार करते समय साइन एक्सटेंशन का परिणाम होगा; इसलिए, उदाहरण के लिए:

char c = '\xf0'; 
int res = (c << 24) | (c << 16) | (c << 8) | c; 

0xfffffff0 बजाय 0xf0f0f0f0 दे देंगे। इसे 0xff के साथ मास्किंग से बचा जा सकता है।

char अभी भी बेहतर हो सकता है यदि आप unsigned char के बजाय इसका उपयोग करने वाले पुस्तकालयों के साथ इंटरफेसिंग कर रहे हैं।

ध्यान दें कि char * से unsigned char * से एक कास्ट हमेशा सुरक्षित (3.9 पी 2) है।

प्रकार T की एक वस्तु की वस्तु प्रतिनिधित्व अनुक्रम है: unsigned char के पक्ष में एक दार्शनिक कारण मानक में है कि 3.9p4 यह पक्ष में है, कम से कम बाइट सरणियों कि वस्तुओं की स्मृति अभ्यावेदन पकड़ सकता है प्रतिनिधित्व करने के लिए है Nunsigned char प्रकार T के ऑब्जेक्ट द्वारा उठाए गए ऑब्जेक्ट्स, जहां Nsizeof(T) के बराबर है।

+0

ओह, वास्तव में अच्छी पकड़ लें। +1 – Cartesius00

1

सैद्धांतिक रूप से, C++ एक बाइट का आकार संकलक सेटिंग्स और लक्ष्य मंच पर निर्भर है, लेकिन यह कम से कम 8 बिट है, जो बताता है कि क्यों sizeof(uint8_t) होने के लिए 1.

यहाँ आवश्यक है होने की गारंटी है अधिक सटीक क्या मानक है कहने के लिए के बारे में यह

§1.71

सी ++ स्मृति मॉडल में मौलिक भंडारण इकाई बाइट है। बाइट कम से कम इतना बड़ा है कि मूल निष्पादन वर्ण सेट (2.3) और यूनिकोड यूटीएफ -8 एन्कोडिंग फॉर्म की आठ-बिट कोड इकाइयों को शामिल करने के लिए पर्याप्त रूप से पर्याप्त है और बिट्स के एक संगत अनुक्रम से बना है, जिसकी संख्या कार्यान्वयन-परिभाषित है। कम से कम महत्वपूर्ण बिट को निम्न-आदेश बिट कहा जाता है; सबसे महत्वपूर्ण बिट को उच्च-आदेश बिट कहा जाता है। सी ++ प्रोग्राम में उपलब्ध स्मृति में संगत बाइट्स के एक या अधिक अनुक्रम होते हैं। प्रत्येक बाइट में एक अद्वितीय पता है।

तो, यदि आप कुछ विशेष हार्डवेयर पर काम कर रहे हैं जहां बाइट 8 बिट्स नहीं हैं, तो यह व्यावहारिक अंतर कर सकता है। अन्यथा, मैं कहूंगा कि यह स्वाद का विषय है और आप किस प्रकार की पसंद के माध्यम से संवाद करना चाहते हैं।

0

कोई व्यावहारिक अंतर नहीं करता है, हालांकि शायद पढ़ने योग्यता बिंदु से यह अधिक स्पष्ट है कि प्रकार unsigned char मान 0..255 मानता है।

0

संभावित रूप से ब्लॉब्स के लिए हस्ताक्षरित मूल्य का उपयोग करने वाली अन्य समस्याओं में से एक यह है कि मान संकेत प्रतिनिधित्व पर निर्भर करेगा, जो मानक का हिस्सा नहीं है। तो, अपरिभाषित व्यवहार का आह्वान करना आसान है।

उदाहरण के लिए ...

signed char x = 0x80; 
int y = 0xffff00ff; 

y |= (x << 8); // UB 

वास्तविक गणित मूल्य भी सख्ती से दो का पूरक है, जो कुछ लोगों को आश्चर्य दे सकते हैं निर्भर करेगा। हस्ताक्षर का उपयोग स्पष्ट रूप से इन समस्याओं से बचाता है।

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