2012-07-22 13 views
12

शुभ दिन SO! मैं दो बाइट चर जोड़ने की कोशिश कर रहा था और अजीब परिणाम देखा।बाइट + बाइट = अज्ञात परिणाम

byte valueA = 255; 
byte valueB = 1; 
byte valueC = (byte)(valueA + valueB); 

Console.WriteLine("{0} + {1} = {2}", valueA.ToString(), 
            valueB.ToString(), 
            valueC.ToString()); 

जब मैं कार्यक्रम चलाने की कोशिश की, यह प्रदर्शित करता है

255 + 1 = 0 

उपरोक्त कोड का क्या हुआ? संकलक OverflowException क्यों नहीं फेंकता है? मैं संभवतः अपवाद कैसे पकड़ सकता हूं? मैं एक वीबी लड़का हूं और धीरे-धीरे सी # में माइग्रेट कर रहा हूं :) प्रश्न के लिए खेद है।

+1

खैर, अपने कोड अतिप्रवाह नहीं करता है। यह कलाकारों के दौरान बिट्स को त्याग देता है, लेकिन आपने स्पष्ट रूप से ऐसा करने के लिए कहा था। नमूना के लिए –

उत्तर

17

सी # कोड डिफ़ॉल्ट रूप से unchecked है, ताकि अपवाद फेंकने के बजाए चुपचाप चारों ओर लपेट जाए।

आप थोड़ा सा प्रदर्शन हिस्ट की लागत पर checked ब्लॉक में अपना कोड लपेटकर अपवाद प्राप्त कर सकते हैं।

9

क्योंकि डिफ़ॉल्ट रूप से, C# अंकगणितीय ऑपरेशन ओवरफ़्लो की जांच नहीं करता है। checked के साथ इसे लपेटने का प्रयास करें ताकि यह अपवाद फेंक देगा।

इस प्रयास करें:

byte valueA = 255; 
byte valueB = 1; 
byte valueC = (byte)(valueA + valueB); 

Console.WriteLine("Without CHECKED: {0} + {1} = {2}", valueA.ToString(), 
                 valueB.ToString(), 
                 valueC.ToString()); 

try 
{ 
    valueC = checked((byte)(valueA + valueB)); 
    Console.WriteLine("With CHECKED: {0} + {1} = {2}", valueA.ToString(), 
                 valueB.ToString(), 
                 valueC.ToString()); 
} 
catch (Exception e) 
{ 
    Console.WriteLine("With CHECKED: " + e.GetType()); 
} 

checked @ MSDN

+0

धन्यवाद –