हां, आप सी कंपाइलर पर सही काम करने के लिए भरोसा कर सकते हैं, जब तक कि बिट फ़ील्ड को एक हस्ताक्षरित प्रकार के साथ घोषित किया गया हो, जिसमें आपके पास uint8_t
है। सी 99 मानक §6.2.6.1/3:
हस्ताक्षरित बिट-फ़ील्ड में संग्रहीत मान और बिना हस्ताक्षरित चार प्रकार की वस्तुओं को शुद्ध बाइनरी नोटेशन का उपयोग करके दर्शाया जाएगा। 40)
§6.7.2.1/9 से:
थोड़ा-क्षेत्र एक हस्ताक्षरित या अहस्ताक्षरित पूर्णांक बिट्स की निर्धारित संख्या से मिलकर प्रकार के रूप में व्याख्या की है। 104) यदि मान 0 या 1 को _Bool
प्रकार के गैर-शून्य-चौड़ाई बिट-फ़ील्ड में संग्रहीत किया गया है, तो बिट-फ़ील्ड का मान संग्रहीत मूल्य के बराबर की तुलना करेगा।
और §6.2.5/9 (जोर मेरा) से:
एक हस्ताक्षरित पूर्णांक प्रकार के गैर नकारात्मक मानों की श्रेणी इसी अहस्ताक्षरित पूर्णांक प्रकार का एक subrange है, और के प्रतिनिधित्व प्रत्येक प्रकार में एक ही मूल्य समान है। 31)हस्ताक्षर किए गए ऑपरेटरों को शामिल करने वाली गणना कभी भी बहती नहीं जा सकती है, जिसके परिणामस्वरूप परिणामस्वरूप हस्ताक्षरित पूर्णांक प्रकार द्वारा प्रतिनिधित्व नहीं किया जा सकता है, यह परिणाम मॉड्यूलो को कम करता है जो कि सबसे बड़ा मान से अधिक होता है जिसे परिणामी प्रकार से दर्शाया जा सकता है।
तो हाँ, आप यह सुनिश्चित करें कि किसी भी मानक-अनुरूप संकलक किसी भी अन्य अवांछित दुष्प्रभावों के बिना 0 करने के लिए G.foo
अतिप्रवाह होगा हो सकता है।
स्रोत
2011-02-05 18:07:57
आपका क्या मतलब है? आपने स्पष्ट रूप से इसे दो बिट्स में डेटा स्टोर करने के लिए कहा है। इसके अलावा, 3 + 1 == 0 मॉड 4 –
यदि आप उस संरचना में अन्य बिटकफील्ड घोषित कर चुके हैं तो मैं उस बिट के साथ क्या होता हूं इसके बारे में अधिक चिंतित होगा। जैसे uint8_t बार: 2; uint8_t foo: 2; uint8_t पू: 2; क्या यह बार या पू को प्रभावित करेगा? – Dave
foo क्या करता है: 2 मतलब है? – CharlesB