मैं आपको इसे वैसा ही करने की सलाह देता हूं जैसा आपने दिखाया है, क्योंकि यह सबसे सीधा आगे है। आरंभ में -1जो हमेशा काम करेगा , वास्तविक साइन प्रतिनिधित्व से स्वतंत्र ~होगा , जबकि कभी-कभी आश्चर्यजनक व्यवहार होगा क्योंकि आपके पास सही ऑपरेंड प्रकार होगा। तभी आपको एक unsignedप्रकार का सबसे उच्च मूल्य मिलेगा ।
संभावित आश्चर्य के उदाहरण के लिए, इस पर विचार करें:
unsigned long a = ~0u;
यह जरूरी नहीं कि सभी 1 बिट्स के साथ एक पैटर्न स्टोर करें a। लेकिन यह पहले सभी बिट्स 1 के साथ एक पैटर्न बनाएगा unsigned int, और फिर इसे असाइन करेगा a। क्या होता है जब unsigned longअधिक बिट्स होता है कि सभी 1 नहीं होते हैं।
और इस पर विचार करें, जो गैर-दो के पूरक प्रतिनिधित्व पर विफल हो जाएगा:
unsigned int a = ~0; // Should have done ~0u !
इसका कारण यह है कि ~0सभी बिट्स को उलटना पड़ता है। इन्वर्टिंग कि -1एक दो के पूरक मशीन पर निकलेगा (जो हमारे लिए आवश्यक मूल्य है!), लेकिन किसी अन्य प्रतिनिधित्व पर नहीं निकलेगा -1। एक पूरक मशीन पर, यह शून्य उपज देता है। इस प्रकार, एक पूरक मशीन पर, उपरोक्त aशून्य को प्रारंभ करेगा ।
आपको यह समझना चाहिए कि यह सभी मूल्यों के बारे में है - बिट्स नहीं। चर को एक मूल्य के साथ आरंभीकृत किया जाता है । यदि इनिशियलाइज़र में आप इनिशियलाइज़ेशन के लिए प्रयुक्त वैरिएबल के बिट्स को संशोधित करते हैं, तो उन बिट्स के अनुसार मान उत्पन्न होगा। aउच्चतम संभव मूल्य को इनिशियलाइज़ करने के लिए आपको जो मूल्य चाहिए, वह है -1या UINT_MAX। दूसरे के प्रकार पर निर्भर करेगा a- आप का उपयोग करने की आवश्यकता होगी ULONG_MAXएक के लिए unsigned long। हालांकि, पहला इसके प्रकार पर निर्भर नहीं करेगा, और यह सबसे अधिक मूल्य प्राप्त करने का एक अच्छा तरीका है।
हम इस बारे में बात नहीं कर रहे हैं कि क्या -1सभी बिट्स एक है (यह हमेशा नहीं होता है)। और हम इस बारे में बात नहीं कर रहे हैं कि क्या ~0सभी बिट्स एक (इसके पास हैं)।
लेकिन हम जिस बारे में बात कर रहे हैं, वह है कि इनिशियलाइज्ड flagsवैरिएबल का परिणाम क्या है। और इसके लिए, केवल-1 हर प्रकार और मशीन के साथ काम करेंगे।