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 टाइप आते हैं।
ये सीमाएँ टाइप की उस स्टोरेज चौड़ाई से तय होती हैं जो सिस्टम उसे देता है। उदाहरण के लिए, एक byte 8 बिट इस्तेमाल करता है और एक long 64 बिट।
ऊपर दिए गए हर टाइप का एक अनसाइन्ड समकक्ष होता है: sbyte/byte, short/ushort, int/uint और long/ulong। हर मामले में वैल्यू की सीमा 0 से लेकर ऋणात्मक साइन्ड अधिकतम गुणा 2 जमा 1 तक होती है।
| टाइप | चौड़ाई | न्यूनतम | अधिकतम |
|---|---|---|---|
| sbyte | 8 बिट | -128 | +127 |
| short | 16 बिट | -32_768 | +32_767 |
| int | 32 बिट | -2_147_483_648 | +2_147_483_647 |
| long | 64 बिट | -9_223_372_036_854_775_808 | +9_223_372_036_854_775_807 |
| byte | 8 बिट | 0 | +255 |
| ushort | 16 बिट | 0 | +65_535 |
| uint | 32 बिट | 0 | +4_294_967_295 |
| ulong | 64 बिट | 0 | +18_446_744_073_709_551_615 |
एक टाइप की वेरिएबल (या एक्सप्रेशन) को आसानी से दूसरे टाइप में बदला जा सकता है। जैसे, किसी असाइनमेंट में, अगर असाइन की जा रही वैल्यू का टाइप (lhs) यह सुनिश्चित करता है कि वैल्यू उस टाइप की सीमा के अंदर रहेगी जिसमें असाइन किया जा रहा है (rhs), तो यह एक सीधा असाइनमेंट है:
uint ui = uint.MaxValue;
ulong ul = ui; // no problem
दूसरी तरफ, अगर जिस टाइप से असाइन किया जा रहा है उसकी सीमा उस टाइप की सीमा का उपसमुच्चय न हो जिसमें असाइन किया जा रहा है, तो कास्ट, यानी () ऑपरेशन ज़रूरी होता है, भले ही वह खास वैल्यू उस टाइप की सीमा के अंदर हो:
short s = 42;
uint ui = (uint)s;
BitConverter क्लास पूर्णांक टाइप को बाइट के ऐरे में और बाइट के ऐरे को पूर्णांक टाइप में बदलने का एक आसान तरीका देती है।
रिमोट कंट्रोल कार प्रोजेक्ट पर काम आगे बढ़ रहा है। टेलीमेट्री सिस्टम में बैंडविड्थ बहुत सीमित है, इसलिए आपसे टेलीमेट्री डेटा के आदान-प्रदान के लिए एक मैसेज प्रोटोकॉल बनाने को कहा गया है।
डेटा एक बफर (बाइट ऐरे) में भेजा जाता है। पूर्णांक भेजते समय नीचे बताए गए प्रोटोकॉल का उपयोग करके बफर का आकार घटा दिया जाता है।
हर वैल्यू को सबसे छोटे संभव पूर्णांक टाइप में दर्शाना चाहिए (byte और sbyte टाइप इसमें शामिल नहीं हैं, क्योंकि उनसे बचत बहुत कम होगी):
| से | तक | टाइप |
|---|---|---|
| 4_294_967_296 | 9_223_372_036_854_775_807 | long |
| 2_147_483_648 | 4_294_967_295 | uint |
| 65_536 | 2_147_483_647 | int |
| 0 | 65_535 | ushort |
| -32_768 | -1 | short |
| -2_147_483_648 | -32_769 | int |
| -9_223_372_036_854_775_808 | -2_147_483_649 | long |
वैल्यू को उसके असाइन किए गए टाइप के लिए ज़रूरी बाइट्स की संख्या में बदलना चाहिए। पूरा बफर दो हिस्सों से बनता है: पहला वह बाइट जो बताता है कि बफर में कितने अतिरिक्त बाइट हैं (प्रीफिक्स बाइट), और उसके बाद वे बाइट जिनमें पूर्णांक रखा जाता है (पेलोड बाइट)।
कुछ टाइप बाइट्स की एक ही संख्या इस्तेमाल करते हैं (जैसे uint और int टाइप)। आम तौर पर इनका प्रीफिक्स बाइट एक ही होता, लेकिन तब डिकोड करना मुश्किल हो जाता। इससे बचने के लिए प्रोटोकॉल एक छोटी सी तरकीब लगाता है: साइन वाले टाइपों में प्रीफिक्स बाइट की वैल्यू 256 में से बफर के अतिरिक्त बाइटों की संख्या घटाकर निकलती है।
संचार में सिर्फ प्रीफिक्स बाइट और प्रीफिक्स के बताए अनुसार उसके बाद आने वाले बाइट ही भेजे जाते हैं। अंदरूनी तौर पर भेजने और पाने वाली दोनों रूटीन 9 बाइट का बफर इस्तेमाल करती हैं (ज़रूरत पड़ने पर अंत में शून्य भरकर)।
कृपया TelemetryBuffer.ToBuffer() स्टैटिक मेथड बनाइए, जो उसे दिए गए पैरामीटर को बफर में एनकोड करे।
// Type: ushort, bytes: 2, signed: no, prefix byte: 2
TelemetryBuffer.ToBuffer(5)
// => {0x2, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
// Type: int, bytes: 4, signed: yes, prefix byte: 256 - 4
TelemetryBuffer.ToBuffer(Int32.MaxValue)
// => {0xfc, 0xff, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0 };
कृपया TelemetryBuffer.FromBuffer() स्टैटिक मेथड बनाइए, जो प्राप्त बफर को डिकोड करके वैल्यू को long के रूप में लौटाए।
TelemetryBuffer.FromBuffer(new byte[] {0xfc, 0xff, 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0 })
// => 2147483647
अगर प्रीफिक्स बाइट की वैल्यू अनपेक्षित हो, तो 0 लौटाया जाना चाहिए।
Exercism पर साइन अप कीजिए और C# को 62 कॉन्सेप्ट178 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।