ट्रैक
/
C#
C#
/
सिलेबस
/
पूर्णांक संख्याएँ
पू

पूर्णांक संख्याएँ में C#

7 अभ्यास

पूर्णांक संख्याएँ के बारे में

स्टैटिक टाइपिंग वाली कई भाषाओं की तरह C# भी पूर्णांक दर्शाने वाले कई टाइप देता है। इनमें से हर टाइप की वैल्यू की सीमा अलग होती है। सबसे छोटे सिरे पर sbyte टाइप की न्यूनतम वैल्यू -128 और अधिकतम वैल्यू 127 होती है। सभी पूर्णांक टाइपों की तरह ये वैल्यू <type>.MinValue और <type>.MaxValue के रूप में उपलब्ध होती हैं। सबसे बड़े सिरे पर long टाइप की न्यूनतम वैल्यू -9,223,372,036,854,775,808 और अधिकतम वैल्यू 9,223,372,036,854,775,807 होती है। इनके बीच में short और int टाइप आते हैं।

ऊपर बताए गए हर टाइप के साथ एक अनसाइन्ड समकक्ष टाइप भी जुड़ा होता है: sbyte/byte, short/ushort, int/uint और long/ulong. इन सभी में वैल्यू की सीमा 0 से लेकर ऋणात्मक साइन्ड अधिकतम के 2 गुने में 1 जोड़ने तक होती है।

अनसाइन्ड पूर्णांक टाइपों की वैल्यू सरल आधार 2 प्रणाली में दर्शाई जाती हैं। साइन्ड टाइपों की वैल्यू 2s कॉम्प्लिमेंट वाली साइन्ड संख्या प्रणाली से दर्शाई जाती हैं।

पूर्णांक टाइप इतने सारे होने की वजह मशीन आर्किटेक्चर है: रजिस्टरों का आकार, CPU निर्देशों के आर्गुमेंट का आकार, और CPU के अंदर साइन को कैसे संभाला जाता है। long टाइप की वैल्यू 64 बिट लेती है, जबकि sbyte टाइप की वैल्यू 8 बिट लेती है। कुछ मामलों में इसका असर CPU के प्रदर्शन, मेमोरी के इस्तेमाल और यहाँ तक कि डिस्क के इस्तेमाल पर भी पड़ता है (ऐसे में छोटे पूर्णांक टाइप का चुनाव आम तौर पर फायदेमंद रहता है)। पूर्णांक type का चुनाव करके आप दूसरे डेवलपरों को वैल्यू की अनुमानित सीमा के बारे में मोटे-मोटे तरीके से जानकारी भी दे सकते हैं। जहाँ उस खास इस्तेमाल के बारे में कोई खास बात सामने नहीं आती, वहाँ int टाइप को डिफ़ॉल्ट टाइप की तरह खूब इस्तेमाल किया जाता है। long या ulong का इस्तेमाल आम तौर पर एक साधारण आइडेंटिफायर की तरह किया जाता है। टाइप का आकार बाइटों में तय करता है कि वैल्यू की सीमा क्या होगी।

अब तक जिन टाइपों की चर्चा हुई, वे प्रिमिटिव टाइप हैं। हर टाइप के साथ एक struct उपनाम जुड़ा होता है, जो उस टाइप से जुड़े फील्ड (जैसे MinValue) और मेथड (जैसे ToString()) लागू करता है।

टाइप स्ट्रक्चर चौड़ाई न्यूनतम अधिकतम
sbyte SByte 8 बिट -128 +127
short Int16 16 बिट -32_768 +32_767
int Int32 32 बिट -2_147_483_648 +2_147_483_647
long Int64 64 बिट -9_223_372_036_854_775_808 +9_223_372_036_854_775_807
byte Byte 8 बिट 0 +255
ushort UInt16 16 बिट 0 +65_535
uint UInt32 32 बिट 0 +4_294_967_295
ulong UInt64 64 बिट 0 +18_446_744_073_709_551_615

कास्टिंग

एक टाइप के वेरिएबल (या एक्सप्रेशन) को आसानी से दूसरे टाइप में बदला जा सकता है। उदाहरण के लिए, किसी असाइनमेंट में, अगर असाइन की जा रही वैल्यू का टाइप (rhs) यह तय करता है कि वैल्यू उस टाइप की सीमा के अंदर फिट हो जाएगी जिसमें असाइन किया जा रहा है (lhs), तो सीधा असाइनमेंट हो जाता है:

ulong ul;
uint ui = uint.MaxValue;
ul = ui;    // no problem

दूसरी तरफ, अगर जिस टाइप से असाइन किया जा रहा है उसकी सीमा उस टाइप की सीमा का उपसमुच्चय नहीं है जिसमें असाइन किया जा रहा है, तो कास्ट यानी () ऑपरेशन ज़रूरी होता है, भले ही वह खास वैल्यू उसकी सीमा के अंदर ही हो:

uint ui;
short s = 42;
ui = (uint)s;

ऊपर के उदाहरण में, अगर वैल्यू उस टाइप की सीमा से बाहर होती जिसमें असाइन किया जा रहा है, तो ओवरफ्लो हो जाता। देखिए overflow।

कास्टिंग की ज़रूरत किसी खास वैल्यू से नहीं, बल्कि उसमें शामिल दोनों टाइपों से तय होती है।

आगे के पैराग्राफ़ पूर्णांक टाइपों की कास्टिंग पर चर्चा करते हैं। casting में कास्टिंग और टाइप कन्वर्ज़न की अधिक विस्तृत चर्चा है। पूर्णांक टाइपों और फ्लोटिंग-पॉइंट संख्याओं, char तथा bool के बीच कन्वर्ज़न की चर्चा उसी डॉक्युमेंटेशन में देखिए।

प्रिमिटिव टाइपों की कास्टिंग - इम्प्लिसिट

C# का टाइप सिस्टम C या Javascript के मुकाबले कुछ ज़्यादा सख्त है, और इसी वजह से कास्टिंग के ऑपरेशन भी ज़्यादा सीमित हैं। इम्प्लिसिट कास्टिंग दो संख्या टाइपों के बीच तब होती है जब "to" टाइप "from" टाइप की वैल्यू का पैमाना और साइन सुरक्षित रख सकता हो।

इम्प्लिसिट कास्ट के लिए कोई खास सिंटैक्स नहीं लिखना पड़ता।

प्रिमिटिव टाइपों की कास्टिंग - एक्सप्लिसिट

जहाँ संख्या टाइपों की इम्प्लिसिट कास्टिंग नहीं हो सकती, वहाँ आम तौर पर एक्सप्लिसिट कास्ट ऑपरेटर इस्तेमाल कर सकते हैं।

अगर कास्ट की जा रही वैल्यू "to" टाइप में नहीं दर्शाई जा सकती, क्योंकि वह टाइप उतना बड़ा नहीं है या साइन में टकराव है, तो ओवरफ्लो एक्सेप्शन फेंका जा सकता है।

प्रिमिटिव टाइपों की कास्टिंग - उदाहरण
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;

// implicit cast
int from_ushort = shortUnsignedInt;          // 65535
float from_int = largeInt;                   // -21474836E+09

// explicit cast
uint from_largeInt = (uint)largeInt;         // 2147483647
uint from_neg = (uint) largeNegInt;          // 2147483648 or OverflowException is thrown (if checked)

बिट कन्वर्ज़न

BitConverter क्लास पूर्णांक टाइपों को बाइट के ऐरे में और बाइट के ऐरे से वापस बदलने का सुविधाजनक तरीका देती है।

संदर्भ
GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

पूर्णांक संख्याएँ सीखिए

अभ्यास लॉक है

पूर्णांक संख्याएँ पर अभ्यास करने के लिए 5 और अभ्यास अनलॉक कीजिए