मैं आपको इसे वैसा ही करने की सलाह देता हूं जैसा आपने दिखाया है, क्योंकि यह सबसे सीधा आगे है। आरंभ में -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
हर प्रकार और मशीन के साथ काम करेंगे।