दिलचस्प पोस्ट
JavaFx लेबल में बदलते मूल्य प्रदर्शित करना document.body.scrollTop हमेशा आईई में 0 है जब स्क्रॉल करते समय Web.Config में असेंब्ली नोड का उद्देश्य क्या है? एंड्रॉइड – कोऑर्डिनेटर लेआउट में उपयोग किए जाने पर स्क्रीन पर पाद लेख स्क्रॉल किया जाता है मैं ईमेल कैसे प्राप्त कर सकता हूं और इसे वेब एप्लिकेशन में प्रोसेस कर सकता हूं समाधान में प्रोजेक्ट निर्भरता का उपयोग करते हुए MSBuild संदर्भों (DLL फ़ाइलों) को कॉपी नहीं करता है उसी नामकरण कंटेनर में फेसलेट रचनाओं का पुन: उपयोग करते समय डुप्लिकेट आईडी से बचना स्थानीय विकास में फेसबुक का विकास HTML फॉर्म से सर्वलेट वर्ग को कैसे कॉल करें नरम कीबोर्ड Android दिखाए जाने पर लेआउट को कैसे ले जाएं फ़ायरफ़ॉक्स में event.offsetX सीएसएस रीसेट – यह वास्तव में क्या करता है? जीआईटी फिल्टर-शाखा और रिबेस के बाद टैग को स्वचालित रूप से स्थानांतरित कर सकते हैं? रेल में ओओ डिज़ाइन: सामान डालने के लिए कहां कैसे ImageViews के बहु परत बनाए रखने के लिए और सबसे बड़ा एक के आधार पर उनके पहलू अनुपात रख सकते हैं?

uint8_t बनाम अहस्ताक्षरित चार

सी में unsigned char पर uint8_t का उपयोग करने का क्या लाभ है?

मुझे पता है कि लगभग हर प्रणाली पर uint8_t सिर्फ unsigned char लिए एक typedef है, तो इसका इस्तेमाल क्यों करना है?

वेब के समाधान से एकत्रित समाधान "uint8_t बनाम अहस्ताक्षरित चार"

यह आपका इरादा दस्तावेज करता है – आप एक चरित्र के बजाय छोटे नंबरों को संग्रहित करेंगे।

इसके अलावा यह अच्छा दिखता है अगर आप अन्य टाइपिंग वाले जैसे uint16_t या int32_t का उपयोग कर रहे हैं

बस पंडिताऊ होने के लिए, कुछ सिस्टम में 8 बिट प्रकार नहीं हो सकते। विकिपीडिया के अनुसार:

एन = 8, 16, 32 या 64 के लिए सटीक-चौड़ाई वाले पूर्णांक प्रकारों को परिभाषित करने के लिए एक कार्यान्वयन की आवश्यकता होती है, यदि और केवल अगर इसमें कोई भी प्रकार है जो आवश्यकताओं को पूरा करता है उन्हें किसी अन्य एन के लिए परिभाषित करने की आवश्यकता नहीं है, भले ही वह उपयुक्त प्रकारों का समर्थन करता हो।

इसलिए uint8_t मौजूद नहीं है, हालांकि यह सभी प्लेटफ़ॉर्म के लिए होगा जहां 8 बिट = 1 बाइट। कुछ एम्बेडेड प्लेटफ़ॉर्म भिन्न हो सकते हैं, लेकिन यह बहुत दुर्लभ हो रहा है। कुछ सिस्टम char प्रकार के प्रकार को परिभाषित कर सकते हैं, जो 16 बिट्स हो सकते हैं, ऐसे में शायद कोई भी प्रकार 8-बिट प्रकार का नहीं होगा।

उस (मामूली) मुद्दे के अलावा, @ मार्क रांसोम का जवाब मेरी राय में सबसे अच्छा है एक का उपयोग करें जो सबसे अधिक स्पष्ट रूप से दर्शाता है कि आप किस डेटा का उपयोग कर रहे हैं।

इसके अलावा, मैं मान रहा हूँ कि आप uint8_t ( stdint.h शीर्षलेख में प्रदान की गई C99 से मानक typedef) बजाय uint_8 (किसी भी मानक का हिस्सा नहीं) का uint_8

संपूर्ण मुद्दा कार्यान्वयन-स्वतंत्र कोड लिखना है। unsigned char को 8-बिट प्रकार की गारंटी नहीं है uint8_t है

जैसा आपने कहा था, " लगभग हर प्रणाली"

char शायद कम होने की संभावना में से एक है, लेकिन एक बार जब आप uint16_t और दोस्तों का उपयोग करना शुरू करते हैं, तो uint16_t मिश्रण बेहतर uint16_t , और यह भी एक कोडिंग मानक का हिस्सा हो सकता है।

मेरे अनुभव में दो जगहें हैं जहां हम यूआईटी 8_टी का इस्तेमाल 8 बिट्स (और यूआईटी 16_ टी, इत्यादि) के लिए करना चाहते हैं और जहां 8 बिट्स से छोटे क्षेत्र हो सकते हैं। दोनों जगहें हैं, जहां अंतरिक्ष मामलों और हम अक्सर डेटा की एक कच्ची डंप को देखने की जरूरत है जब डीबगिंग और जल्दी से निर्धारित करने के लिए सक्षम होने की आवश्यकता है कि यह क्या प्रतिनिधित्व करता है।

पहला आरएफ प्रोटोकॉल में है, खासकर संकीर्ण बैंड सिस्टम में। इस माहौल में हमें एक ही संदेश में उतना जानकारी पैक करना पड़ सकता है जितना कि हम एक संदेश में कर सकते हैं। दूसरा फ्लैश स्टोरेज में है जहां हमारे पास बहुत सीमित स्थान हो सकता है (जैसे कि एम्बेडेड सिस्टम में)। दोनों ही मामलों में हम एक पैक डेटा संरचना का उपयोग कर सकते हैं जिसमें कंपाइलर हमारे लिए पैकिंग और अनपैकिंग का ध्यान रखेगा:

 #pragma pack(1) typedef struct { uint8_t flag1:1; uint8_t flag2:1; padding1 reserved:6; /* not necessary but makes this struct more readable */ uint32_t sequence_no; uint8_t data[8]; uint32_t crc32; } s_mypacket __attribute__((packed)); #pragma pack() 

आपके द्वारा उपयोग की जाने वाली विधि आपके कंपाइलर पर निर्भर करती है। आपको एक ही हेडर फाइल के साथ कई अलग-अलग कम्पाइलर का भी समर्थन करना पड़ सकता है ऐसा एम्बेडेड सिस्टम में होता है जहां डिवाइस और सर्वर पूरी तरह से अलग हो सकते हैं – उदाहरण के लिए आपके पास एआरएम डिवाइस हो सकता है जो एक x86 लिनक्स सर्वर से संचार करता है।

पैक संरचनाओं का उपयोग करने के साथ कुछ चेतावनियां हैं। सबसे बड़ी पकड़ यह है कि आपको किसी सदस्य के पते को हटाने से बचना चाहिए। म्यूटिबाइट गठबंधन वाले शब्दों वाले सिस्टम पर, इसका परिणाम गलत रूप से अपवाद हो सकता है – और एक coredump।

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

लेकिन चूंकि पैक संरचनाएं संचार और डेटा संग्रहण के लिए सबसे अधिक उपयोगी होती हैं, फिर स्मृति में इसके साथ काम करते समय डेटा को गैर-पैक प्रतिनिधित्व में निकाला जा सकता है। आम तौर पर हमें स्मृति में पूरे डाटा पैकेट के साथ काम करने की ज़रूरत नहीं है।

यहाँ कुछ प्रासंगिक चर्चा है:

pragma पैक (1) और __attribute__ ((संरेखित (1))) काम करता है

क्या जीसीसी का __डेटाइट __ ((पैक किया गया है) / # प्रगामा पैक असुरक्षित है?

http://solidsmoke.blogspot.ca/2010/07/woes-of-structure-packing-pragma-pack.html

थोड़ा सा है पोर्टेबिलिटी दृष्टिकोण से, char 8 बिट्स से छोटा नहीं हो सकता है, और कुछ भी char से छोटा नहीं हो सकता है, इसलिए यदि कोई दिया सी कार्यान्वयन एक अहस्ताक्षरित 8-बिट पूर्णांक प्रकार है, तो यह char होने वाला होगा वैकल्पिक रूप से, इसमें एक भी नहीं हो सकता है, जिस पर कोई typedef महत्वपूर्ण हैं

इसका उपयोग आपके कोड को बेहतर तरीके से दस्तावेज़ में करने के लिए किया जा सकता है, यह स्पष्ट है कि आपको 8-बिट बाइट्स की आवश्यकता होती है और कुछ और नहीं लेकिन व्यवहार में यह वास्तव में कहीं भी एक उचित उम्मीद है (वहां डीएसपी प्लेटफार्म हैं, जिस पर यह सच नहीं है, लेकिन आपके कोड चलाने की संभावनाएं पतली होती हैं, और आप अपने प्रोग्राम के शीर्ष पर स्थिर स्थिति का उपयोग करके भी त्रुटि निकाल सकते हैं ऐसे मंच)।

लगभग हर प्रणाली पर मैं uint8_t == अहस्ताक्षरित चार मिले, लेकिन सी मानक द्वारा इसकी गारंटी नहीं है। यदि आप पोर्टेबल कोड लिखने का प्रयास कर रहे हैं और यह महत्वपूर्ण है कि स्मृति का आकार क्या है, तो यूआईटी 8_टी का उपयोग करें अन्यथा अहस्ताक्षरित चार का उपयोग करें

यह वास्तव में महत्वपूर्ण है उदाहरण के लिए जब आप एक नेटवर्क विश्लेषक लिख रहे हों पैकेट हेडर को प्रोटोकॉल विनिर्देश द्वारा परिभाषित किया जाता है, न कि किसी विशेष प्लेटफॉर्म के सी कंपाइलर द्वारा काम करता है।