ट्रैक
/
C#
C#
/
सिलेबस
/
ओवरफ्लो
ओव

ओवरफ्लो में C#

1 अभ्यास

ओवरफ्लो के बारे में

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

  • अनसाइन्ड पूर्णांक (byte, ushort, uint, ulong) शून्य पर पहुँच जाते हैं, क्योंकि टाइप की अधिकतम वैल्यू + 1 एक मॉड्यूलस की तरह काम करती है। यह तभी नहीं होता जब वे किसी checked ब्लॉक के अंदर हों, और ऐसा होने पर OverflowException की एक इंस्टेंस फेंकी जाती है। मोटे तौर पर यह कंपाइलर सेटिंग पर निर्भर करता है। int और long भी इसी तरह व्यवहार करते हैं, बस वे क्रमशः int.MinValue और long.minValue पर पहुँच जाते हैं।
int one = 1;
checked
{
    int expr = int.MaxValue + one;  // overflow exception is thrown
}

// or

int expr2 = checked(int.MaxValue + one);  // overflow exception is thrown
  • अगर कोई लिटरल एक्सप्रेशन उस वेरिएबल को ओवरफ्लो करा देगा जिसे वह असाइन किया गया है, तो कंपाइल-टाइम एरर आती है।
  • checked स्थिति सिर्फ उन्हीं एक्सप्रेशन पर लागू होती है जो सीधे ब्लॉक के अंदर हैं। जिन फंक्शनों को कॉल किया जाता है, उनमें हुआ ओवरफ्लो नहीं पकड़ा जाता।
  • float और double टाइप अनंत की स्थिति में चले जाते हैं, जिसे float.IsInfinity() आदि से जाँचा जा सकता है।
double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
  • decimal टाइप की संख्याओं पर OverflowException की एक इंस्टेंस फेंकी जाती है।
  • इसके लिए एक मेल खाता unchecked कीवर्ड भी है, जो उन जगहों के लिए है जहाँ आप किसी checked ब्लॉक के अंदर unchecked का असर उलटना चाहते हैं, या जहाँ कंपाइलर सेटिंग इस्तेमाल की गई हो।

जो ओवरफ्लो बिना कोई एक्सेप्शन फेंके हो जाते हैं, वे दिक्कत पैदा कर सकते हैं। आम तौर पर यह बात सही है कि कोई भी एरर की स्थिति जितनी जल्दी बताई जा सके, उतना अच्छा है।

int और float में ओवरफ्लो की समस्याएँ कम की जा सकती हैं। इसके लिए नतीजे को long, decimal या double टाइप के किसी वेरिएबल में असाइन कर दीजिए।

अगर आपके कोड के लिए बड़े पूर्णांक ज़रूरी हैं, तो BigInteger टाइप इस्तेमाल करना एक विकल्प है।

स्वाभाविक रूप से, ऐसे मौके भी होते हैं जब किसी पूर्णांक को शून्य पर पहुँचने देना बिल्कुल जायज़ होता है, खास तौर पर अनसाइन्ड वैल्यू के मामले में। इसका एक क्लासिक उदाहरण हैश कोड हैं, जो पूर्णांक की चौड़ाई को एक तरह के मॉड्यूलो की तरह इस्तेमाल करते हैं।

कोड बेस में आम तौर पर आप देखेंगे कि जहाँ uint या ulong को आइडेंटिफायर की तरह इस्तेमाल किया जाता है, वहाँ अक्सर कोई जाँच नहीं होती, क्योंकि उसे करना फायदे से ज़्यादा झंझट माना जाता है। यह वहाँ भी लागू होता है जहाँ डोमेन से ही साफ हो कि किसी बहुत बड़ी वैल्यू की ज़रूरत नहीं पड़ेगी। लेकिन सबक देने वाली एक कहानी के लिए यह देखिए।

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

ओवरफ्लो सीखिए