2015-08-27 5 views
6

हाय इस कोड पर विचार मतलब नहीं है:इस सी कोड के कुछ हिस्सों के लिए मुझे

uint16_t dest_pid; 
uint8_t *p; 

pf->dest_pid = p[0] + (p[1] << 8) //(p[1] << 8) equals 0 right? 

इस कोड एम्बेडेड ऑपरेटिंग सिस्टम के ड्राइवर का एक हिस्सा है। कुछ विचार उस कथन के पीछे क्या विचार हो सकता है? या हो सकता है कि मुझे कुछ आवश्यक याद आ रही है?

+0

अपरिपक्व संकेतक को संदर्भित करना ?? निश्चित नहीं है कि विचार क्या है लेकिन यह निश्चित रूप से एक अच्छा विचार नहीं है। जब तक आप कुछ कोड याद नहीं कर रहे हैं? – mathematician1975

+1

'(पी [1] << 8) 'अभिव्यक्ति का हिस्सा है)। इसमें एक प्रकार (हस्ताक्षरित) है, जो * पी [1] के प्रकार से * व्युत्पन्न * है: यह केवल हस्ताक्षर किए गए गुणवत्ता को "विरासत" देता है, आकार नहीं। – joop

+0

यहां देखें: http://stackoverflow.com/questions/12131568/bit-shifting-a-byte-by-more-than-8-bit – Downvoter

उत्तर

4

पहले: dest_pidpf के बाद संरचना से हिस्सा है और मुझे लगता है कि यह एक और चर तो uint16_t dest_pid;

दूसरा है: puint8_t के लिए सूचक है, आप 8 से शिफ्ट जब आप (p[1] << 8) करना क्या सूचक के अंदर है के लिए, उदाहरण के लिए p[1] = 0xE5 स्थानांतरण के बाद यह 0xE500 होगा। याद रखें कि आपने अपना परिणाम dest_pid में रखा है जो 2 बाइट्स वैरिएबल है।

अंतिम पंक्ति का अनुवाद सबसे pid की कम बाइट (कम महत्वपूर्ण) लेने के लिए और pid के उच्च बाइट (8 से स्थानांतरित कर दिया) में जोड़ना और pf->dest_pid में रख जाने की संभावना है, तो आप सोच सकते हैं कि क्यों वह नहीं था शुरुआत से 2 बाइट्स नहीं भेजते हैं, और इसका कारण हो सकता है क्योंकि वह इसे बस से प्राप्त कर रहा है जो समय (चक्र) प्रति इकाई केवल एक बाइट भेजता है।

8

मुझे लगता है कि आपका p अर्थपूर्ण रूप से प्रारंभ किया गया है (कुछ मान्य स्थान पर इंगित करने के लिए)।

फिर p[0] + (p[1] << 8) में p[1] परोक्ष unsigned के लिए छोड़ दिया पारी << 8 करने से पहले पदोन्नत किया जाएगा, तो कोड मतलब (जैसे एआरएम की तरह 32 बिट प्रोसेसर पर) करता है। अनौपचारिक रूप से यह एक 16 बिट संख्या जिसका कम 8 बिट p[0] से कर रहे हैं और उच्च 8 बिट से p[1]

कुल मिलाकर बोल रहे हैं बनाता है, निहित नियम यह है कि सी में अंकगणितीय आपरेशनों में कम से कम (और कभी नहीं डेटा के छोटे टुकड़े पर int पर हैं जैसे short या uint8_t या char)। लेकिन विवरण अधिक जटिल हैं (और सी 8 9 से सी 99 और सी 11 मानकों से थोड़ा विकसित हुए हैं)।

+4

मान लीजिए 'uint8_t', 'p [1]' को _integer promotions_ की वजह से,' int '(या' पसंद करते हुए 'हस्ताक्षरित') पर निहित रूप से डाला जाएगा। इस मामले में कोई और रास्ता नहीं है। –

+0

यह सही है, लेकिन पी के प्रकार [जो भी अंदर है] आठ बिट्स है। अगर इसे स्पष्ट रूप से ".. + (uint16_t) (पी [1] << 8) के रूप में डाला गया था," मैं समझूंगा, यह पी [1] * 256 के बराबर होगा। अभी के लिए मैं केवल यह देखता हूं "(आठ_bit_var < <8) "जो (मेरे लिए) शून्य का मतलब है। –

+0

@ राडोस्लो क्रसिमिमो: आप गलत हैं: '(आठbitvar << 8)' 8 बिट्स ऑपरेंड शिफ्ट नहीं है, लेकिन एक 'int' शिफ्ट है। तो यह हमेशा शून्य नहीं होता है। –

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