c# - अनियंत्रित प्रसंग में int.inValue को-1 थ्रो ओवरफ्लो अपवाद से क्यों विभाजित किया जाए?




checked unchecked (2)

यह एक अपवाद नहीं है कि C # संकलक या घबराना का कोई नियंत्रण नहीं है। यह इंटेल / एएमडी प्रोसेसर के लिए विशिष्ट है, जब IDIV निर्देश विफल हो जाता है, तो CPU #DE जाल (डिवाइड त्रुटि) उत्पन्न करता है। ऑपरेटिंग सिस्टम प्रोसेसर जाल को संभालता है और इसे STATUS_INTEGER_OVERFLOW अपवाद के साथ वापस प्रक्रिया में दर्शाता है। सीएलआर कर्तव्यनिष्ठ रूप से इसका मिलान एक प्रबंधित प्रबंधित अपवाद में करता है।

इंटेल प्रोसेसर मैनुअल इसके बारे में जानकारी की सोने की खान नहीं है:

गैर-अभिन्न परिणाम 0. की ओर काटे जाते हैं (काटे जाते हैं) शेष हमेशा परिमाण में भाजक से कम होता है। ओवरफ्लो को सीएफ ध्वज के बजाय #DE (विभाजन त्रुटि) अपवाद के साथ इंगित किया गया है।

अंग्रेजी में: हस्ताक्षर किए गए विभाजन का परिणाम +2147483648 है, यह एक इंट्यू में उल्लेखनीय नहीं है क्योंकि यह Int32.MaxValue + 1. अन्यथा प्रोसेसर के नकारात्मक मूल्यों का प्रतिनिधित्व करने के तरीके का एक अनिवार्य पक्ष प्रभाव है, यह दो-पूरक एन्कोडिंग का उपयोग करता है। जो 0 का प्रतिनिधित्व करने के लिए एक एकल मान पैदा करता है, नकारात्मक और सकारात्मक मूल्यों का प्रतिनिधित्व करने के लिए अन्य संभावित एन्कोडिंग की एक विषम संख्या को छोड़कर। नकारात्मक मूल्यों के लिए एक और है। इसी तरह के अतिप्रवाह के रूप में -Int32.MinValue , सिवाय इसके कि प्रोसेसर -Int32.MinValue निर्देश पर ट्रैप नहीं करता है और सिर्फ एक कचरा परिणाम पैदा करता है।

C # भाषा बेशक इस समस्या से ग्रस्त नहीं है। सी # लैंग्वेज स्पेक इसे विशेष व्यवहार को ध्यान में रखते हुए क्रियान्वित परिभाषित व्यवहार (अध्याय 7.8.2) बनाता है। कोई अन्य वाजिब चीज जो वे इसके साथ नहीं कर सकते थे, अपवाद को संभालने के लिए कोड का सृजन करना निश्चित रूप से बहुत ही अव्यावहारिक माना जाता था, बिना किसी धीमी गति के कोड का उत्पादन करना। सी # तरीका नहीं है।

C और C ++ भाषा इसे अपरिभाषित व्यवहार बनाकर पूर्व में निर्दिष्ट करती है। यह वास्तव में बदसूरत हो सकता है, जैसे कि gcc या g ++ कंपाइलर के साथ संकलित प्रोग्राम, आमतौर पर MinGW टूलकिन के साथ। एसईएच के लिए अपूर्ण रनटाइम समर्थन है, यह अपवाद को निगलता है और प्रोसेसर को विभाजन निर्देश को फिर से शुरू करने की अनुमति देता है। कार्यक्रम लटका हुआ है, प्रोसेसर के साथ 100% कोर जल रहा है जो लगातार #DE जाल उत्पन्न करता है। पौराणिक हॉल्ट में विभाजन को चालू करना और अग्नि निर्देश पकड़ना :)

int y = -2147483648;
int z = unchecked(y / -1);

दूसरी पंक्ति एक OverflowException कारण बनती है। क्या इसे रोकने के लिए unchecked नहीं होना चाहिए?

उदाहरण के लिए:

int y = -2147483648;
int z = unchecked(y * 2);

एक अपवाद का कारण नहीं है।


सी # 4 चश्मा राज्यों की धारा 7.72 (डिवीजन ऑपरेटर):

यदि बाएं ऑपरेंड सबसे छोटा प्रतिनिधित्व योग्य इंट या लंबा मूल्य है और सही ऑपरेंड -1 -1 है, तो एक अतिप्रवाह होता है। एक जाँच के संदर्भ में, [...]। एक अनियंत्रित संदर्भ में, यह कार्यान्वयन-परिभाषित है कि क्या एक System.ArithmeticException (या एक उपवर्ग) को फेंक दिया गया है या ओवरफ्लो अप्रचलित हो जाता है जिसके परिणामस्वरूप मूल्य बाएं ऑपरेंड का होता है।

तो यह तथ्य कि यह एक अनियंत्रित संदर्भ में एक अपवाद फेंकता है वास्तव में एक बग नहीं है, क्योंकि व्यवहार कार्यान्वयन-परिभाषित है।





overflowexception