मैं एक STM32F105 के लिए सी में एक आवेदन लिख रहा हूँ, जीसीसी का उपयोग कर।
अतीत (सरल परियोजनाओं के साथ) में, मैं हमेशा की तरह चर को परिभाषित किया है char
, int
, unsigned int
, और इतने पर।
मुझे लगता है कि यह इस तरह के रूप में परिभाषित किया गया stdint.h प्रकार, उपयोग करने के लिए आम बात है int8_t
, uint8_t
, uint32_t
, आदि यह यह कई एपीआई कि मैं उपयोग कर रहा हूँ, और यह भी अनुसूचित जनजाति से एआरएम CMSIS पुस्तकालय में सच।
मेरा मानना है कि मैं समझता हूं कि हमें ऐसा क्यों करना चाहिए; कंपाइलर को मेमोरी स्पेस को बेहतर ऑप्टिमाइज़ करने की अनुमति देना। मुझे उम्मीद है कि अतिरिक्त कारण हो सकते हैं।
हालाँकि, c के पूर्णांक पदोन्नति नियमों के कारण, मैं किसी भी समय दो चेतावनियाँ जोड़ने का प्रयास करता हूँ, किसी भी समय एक बिटवाइज़ ऑपरेशन आदि करने की कोशिश में रूपांतरण चेतावनियों के खिलाफ दौड़ता रहता हूँ conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
। इस मुद्दे पर यहाँ और यहाँ चर्चा की गई है ।
जब चर के रूप में घोषित का उपयोग कर यह नहीं होता है int
या unsigned int
।
कुछ उदाहरण देने के लिए, यह दिया:
uint16_t value16;
uint8_t value8;
मुझे इसे बदलना होगा:
value16 <<= 8;
value8 += 2;
इसके लिए:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
यह बदसूरत है, लेकिन यदि आवश्यक हो तो मैं यह कर सकता हूं। यहाँ मेरे सवाल हैं:
वहाँ एक मामले में जहां से रूपांतरण है अहस्ताक्षरित के लिए हस्ताक्षर किए और वापस करने के लिए अहस्ताक्षरित परिणाम गलत कर देगा?
वहाँ stdint.h पूर्णांक प्रकार का उपयोग करने के खिलाफ / के लिए कोई अन्य बड़े कारण हैं?
जवाब मैं प्राप्त कर रहा हूँ के आधार पर यह, stdint.h प्रकार की तरह आम तौर पर पसंद कर रहे हैं लग रहा है यहां तक कि ग धर्मान्तरित हालांकि uint
करने के लिए int
और वापस। यह एक बड़ा सवाल है:
- मैं टाइपकास्टिंग (जैसे
value16 = (uint16_t)(value16 << 8);
) का उपयोग करके संकलक चेतावनी को रोक सकता हूं । क्या मैं सिर्फ समस्या छिपा रहा हूँ? क्या इसके बारे में जाने का एक बेहतर तरीका है?
value8 += 2u;
और value8 = value8 + 2u;
, लेकिन मुझे एक ही चेतावनी मिलती है।
8u
और2u
।