2014-05-23 10 views
30

मेरी समझ करने के लिए, कि आप एक अतिप्रवाह त्रुटि देना चाहिए और जब मैं इसे इस तरह लिखना:int.MaxValue - int.MinValue = -1 क्यों?

public static void Main() 
{ 

    Console.WriteLine(int.MaxValue - int.MinValue); 
} 

इसे सही ढंग से मुझे एक अतिप्रवाह त्रुटि देता है।

हालांकि:

public static void Main() 
{ 

    Console.WriteLine(test()); 
} 

public static Int32 test(int minimum = int.MinValue, int maximum = int.MaxValue) 
{ 
    return maximum - minimum; 
} 

इच्छा उत्पादन -1 यह ऐसा क्यों करता है? इसे एक त्रुटि फेंकनी चाहिए क्योंकि यह स्पष्ट रूप से एक अतिप्रवाह है!

+6

हूँ मैं केवल एक ही व्यक्ति सिखाया गया था कि कि 2147483647 हो सकता है। 2147483648) वास्तव 4294967295 – Aelphaeis

+0

हां में है 4294967295 किसी पूर्णांक नहीं है – harold

+0

आपको 2147483647 - 2147483648 की उम्मीद करने के लिए आप क्या उम्मीद करेंगे? –

उत्तर

46

int.MaxValue - int.MinValue = एक मूल्य जो int पकड़ नहीं सकता है। इस प्रकार, संख्या वापस -1 के आसपास लपेटती है। ; जो एक पूर्णांक

Int32.MinValue Field

इस निरंतर का मूल्य -+२१४७४८३६४८ है नहीं है - (- 2147483648) = 4294967295

यह 2147483647 की तरह है है, हेक्साडेसिमल 0x80000000।

और Int32.MaxValue Field

इस निरंतर का मूल्य 2,147,483,647 है; है, हेक्साडेसिमल 0x7FFFFFFF।

MSDN

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

+4

संपादन इसे समझाता है, मुझे यह आश्चर्य की बात है कि डिफ़ॉल्ट रूप से संकलक एक अनचेक स्थिति में है। – Aelphaeis

+0

@Aelphaeis: - हाँ और इसमें जोड़ने के लिए चेक किए गए कीवर्ड का उपयोग अभिन्न प्रकार के अंकगणितीय संचालन और रूपांतरणों के लिए अतिप्रवाह जांच को स्पष्ट रूप से सक्षम करने के लिए किया जाता है। –

+2

@ एल्फेइस मैं आश्चर्यचकित हूं और साथ ही मुझे यकीन था कि डिफॉल्ट चेक किया गया था। लेकिन [प्रति एमएसडीएन, वास्तव में '/ check-' डिफ़ॉल्ट है] (http://msdn.microsoft.com/en-us/library/h25wtyxf.aspx)। यह एक खराब डिफ़ॉल्ट पसंद की तरह लगता है क्योंकि यह रनटाइम पर प्रोग्रामिंग त्रुटि को अनदेखा करने की अनुमति देता है (और संभवतः [सुरक्षा प्रभाव?] (Http://cwe.mitre.org/data/definitions/190.html))। मुझे आश्चर्य है कि सी # टीम ने ऐसा विकल्प क्यों बनाया ... – LB2

13

यह आपके कोड की संकलन-समय ओवरफ़्लो जांच के कारण है। लाइन

Console.WriteLine(int.MaxValue - int.MinValue); 

नहीं होगा वास्तव में कार्यावधि में त्रुटि है, यह होगा सरल लिखने "-1", लेकिन आप संकलन त्रुटि मिलती है "चेक मोड में संकलन समय पर आपरेशन overflows" जाँच अतिप्रवाह के कारण।

संकलन समय अतिप्रवाह इस मामले में जाँच के चारों ओर पाने के लिए आप कर सकते हैं:

  unchecked 
     { 
      Console.WriteLine(int.MaxValue - int.MinValue);     
     } 

कौन सा ठीक है और उत्पादन "-1"

+0

@ माइकल पर प्रकाश डाला गया कि कैसे रनटाइम ओवरफ्लो जांच संकलन स्तर पर एक विकल्प है। – Aidanapword

+1

यह उत्तर पूरा करने के लिए, आप विपरीत प्रभाव भी दिखा सकते हैं - 'रीस्ट' विधि में गणना के आसपास 'चेक' डालने के लिए - इसे अपवाद फेंकने के लिए, जो ओपी चाहता था। – ClickRick

2

डिफ़ॉल्ट परियोजना स्तरीय सेटिंग है कि इस को नियंत्रित करता है चलेंगे डिफ़ॉल्ट रूप से "अनचेक" पर सेट है। आप प्रोजेक्ट गुणों पर जाकर ओवरफ़्लो चेकिंग चालू कर सकते हैं, टैब बनाएं, उन्नत बटन। पॉपअप आपको अतिप्रवाह जांच चालू करने की अनुमति देता है। आपके द्वारा लिंक किया गया .NET Fiddle टूल कुछ अतिरिक्त स्थिर विश्लेषण करने लगता है जो आपको वास्तविक आउट ऑफ़ द बॉक्स रनटाइम व्यवहार को देखने से रोक रहा है।(उपरोक्त आपके पहले कोड स्निपेट के लिए त्रुटि "ऑपरेशन को चेक मोड में संकलन समय पर बहती है।" आप रनटाइम त्रुटि नहीं देख रहे हैं।)

2

मुझे लगता है कि यह ओवरफ्लो से भी आगे जाता है।

अगर मैं इस

Int64 max = Int32.MaxValue; 
Console.WriteLine(max.ToString("X16")); // 000000007FFFFFFF 
Int64 min = Int32.MinValue; 
Console.WriteLine(min.ToString("X")); //FFFFFFFF80000000 
Int64 subtract = max - min; 
Console.WriteLine(subtract.ToString("X16")); //00000000FFFFFFFF <- not an overflow since it's a 64 bit number 
Int32 neg = -1 
Console.WriteLine(neg.ToString("X")); //FFFFFFFF 

को देखो यहाँ आप है कि अगर आप सिर्फ 2 के पूरक में हेक्स मान) घटाना आप संख्या है कि -1 एक 32 बिट संख्या में मिलता है देखते हैं। (- - (प्रमुख 0 के

2 के पूरक गणित trunkating के बाद बहुत मज़ा http://en.wikipedia.org/wiki/Two 's_complement

संबंधित मुद्दे