स्टैटिक टाइपिंग वाली कई भाषाओं की तरह 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 क्लास पूर्णांक टाइपों को बाइट के ऐरे में और बाइट के ऐरे से वापस बदलने का सुविधाजनक तरीका देती है।