में पोर्टेबल बिट मास्क और झंडे को लागू करना मैं विभिन्न माइक्रोकंट्रोलर आर्किटेक्चर/शब्द आकारों का उपयोग करके एम्बेडेड सिस्टम के लिए फर्मवेयर विकसित करता हूं और जब मैं कर सकता हूं पोर्टेबिलिटी पर जोर देने की कोशिश करता हूं। मेरा सवाल बिट मास्क और झंडे को उत्पन्न/लागू करने के बारे में है जो सुरक्षित और पोर्टेबल है, और किसी गैर-सार्वभौमिक कोड के लिए, कोने के मामले क्या होंगे।सी
बिट मास्क
#define MASK_8_V1(x) ((x) & 0xFF)
#define MASK_8_V2(x) ((x) & 0x00FF)
a = MASK_8_V1(b)
a = MASK_8_V2(b)
ये हमेशा जहां सभी बिट्स कम 8 ख से छोड़कर बाहर zero'd कर रहे हैं एक की चौड़ाई का मान प्राप्त करने के लिए गारंटी रहे हैं? क्या 2 संस्करणों के बीच कोई अंतर है क्योंकि यदि आवश्यक हो तो उन्हें विस्तारित किया जाना चाहिए?
झंडे
#define GEN_FLAG_16(x) ((0xFFFF) & ((unsigned) 1 << (x)))
#define GEN_FLAG_32(x) ((0xFFFFFFFF) & ((unsigned long) 1 << (x)))
मैं झंडा स्थिरांक पैदा करने के लिए एक सामान्य मैक्रो की जरूरत है, यह हमेशा सूचीबद्ध चौड़ाई के लिए एक ध्वज निरंतर में परिणाम होगा?
दोनों
#define CHECK_FLAG_16(x, y) ((x) & GEN_FLAG_16(y))
#define CHECK_FLAG_32(x, y) ((x) & GEN_FLAG_32(y))
if(CHECK_FLAG_16(a, b))
{
// Do something.
}
पिछले परिदृश्यों का मेल, यह हमेशा भीतरी कोड यदि ख के मूल मूल्य में वांछित बिट सेट कर दिया जाता निष्पादित करेंगे?
सभी मामलों लिए, मान लें:
- C90 या C99 अनुरूप संकलक
- ए और बी देशी सी प्रकारों में से किसी मनमाना संयोजन, हमेशा पर हस्ताक्षर किए या अहस्ताक्षरित
- एक्स एक सकारात्मक पूर्णांक का मूल्यांकन किया जा सकता हैके उपयोग का उल्लेख उन लोगों के लिए टाइप करें
- मनमाने ढंग से देशी शब्द आकार
संपादित करें: मैंने हाल ही में एक ऐसे मुद्दे पर पहुंचा जहां हमें एक सीरियल प्रोटोकॉल हैंडलर को पोर्ट करने की आवश्यकता थी जिसे मैंने एक और माइक्रोकंट्रोलर परिवार पर लिखा था, केवल यह पता लगाने के लिए कि राम बाइट एड्रेसेबल नहीं था। हमने uint8_t के सभी उपयोगों को हटा दिया और 16-बिट एड्रेसेबल मेमोरी के साथ काम करने के लिए संशोधन किए। इससे मुझे आश्चर्य हुआ कि क्या मैं बाद में संशोधन से बचने के लिए देशी सी प्रकारों के साथ इसे अलग-अलग लागू कर सकता था। मेरे प्रश्न अप्रत्यक्ष रूप से उस समस्या से आए थे।
आपने किस कंपाइलर को आजमाया? जब आपने कोशिश की तो क्या हुआ। और आपने इनके संबंध में चश्मा पढ़ा? और उन्होंने क्या कहा? –
आप '0xff'' 0x00000000ff' से अलग क्यों हैं? और किसी भी कारण से आप निश्चित चौड़ाई प्रकार का उपयोग नहीं करते हैं जिन्हें विशेष रूप से निश्चित चौड़ाई डेटा के लिए परिभाषित किया जाता है? 'Stdint.h' देखें! साइड-नोट के रूप में: हस्ताक्षरित पूर्णांक का उपयोग न करें। – Olaf
आपके पास दो बयान हैं जो कि एक-दूसरे से विरोधाभास करते हैं: 1. जब मैं कर सकता हूं तो पोर्टेबिलिटी पर जोर देने की कोशिश करता हूं। 2. मुझे केवल मूल्य के निचले 8 बिट्स में दिलचस्पी है। –