2015-12-18 9 views
5

क्यों मैं एक संकलक त्रुटि यहाँ प्राप्त:पूर्णांक अतिप्रवाह अपवाद

int a = 2147483647 + 10; 

और नहीं यहाँ, अगर मैं एक ही कार्य को करते हूँ:

int ten = 10; 
int b = 2147483647 + ten; 

मैं के उपयोग की जाँच की सीख रहा हूँ और एमएसडीएन वेबसाइट स्पष्ट नहीं है कि ओवरफ्लोएक्सप्शन पहले कोड स्निपेट में क्यों उठाया गया है:

द्वारा गलती, एक अभिव्यक्ति जिसमें केवल स्थिर मान होते हैं, संकलक त्रुटि का कारण बनता है यदि अभिव्यक्ति गंतव्य प्रकार की सीमा के बाहर एक मान उत्पन्न करती है। यदि अभिव्यक्ति में एक या अधिक गैर-स्थिर मान हैं, तो कंपाइलर ओवरफ़्लो का पता नहीं लगाता है।

यह केवल व्यवहार नहीं बल्कि उस व्यवहार के लिए कारणों बताते हैं। मैं जानना चाहता हूं कि हुड के नीचे क्या होता है।

+1

आपको पहले मामले में अपवाद नहीं, एक कंपाइलर त्रुटि मिल रही है। – CodesInChaos

उत्तर

9

कारण आप int a = 2147483647 + 10; संकलक बयान (a) का परिणाम की भविष्यवाणी कर सकते हैं और यह पता चल जाएगा कि यह अतिप्रवाह का कारण बनता है, क्योंकि दोनों और स्थिरांक हैं और उनके मान संकलन समय पर जाना जाता है जब है।

लेकिन आप

int ten = 10; 
int b = 2147483647 + ten; 

कुछ अन्य धागा (या कुछ और, शायद एक जादूगर है, शायद स्मृति में एक खतरा ...) int b = 2147483647 + ten; बयान और के निष्पादन से पहले ten का मूल्य बदल हो सकता है जब संकलन समय पर अतिप्रवाह की भविष्यवाणी नहीं की जा सकती है।

+1

30 सेकंड तक जीत गया ... आप तेज़ हैं। +1 –

+0

ठीक है, तो संकलक शिकायत करता है कि दोनों संख्याओं का मूल्यांकन कब होता है लेकिन यह संख्या और परिवर्तनीय "दस" का मूल्यांकन नहीं करता है। उस मामले पर अतिप्रवाह को पहचानने के लिए आपको चेक का उपयोग करने के लिए मजबूर होना पड़ता है। यह असंगतता का थोड़ा सा है, है ना? – Rober

+1

यदि आप वही व्यवहार (रनटाइम पर) चाहते हैं तो बस इसे "अनचेक" के बजाय डिफ़ॉल्ट रूप से "चेक" करने के लिए प्रोजेक्ट सेटिंग्स में बॉक्स को चेक करें, या चेक किए गए ब्लॉक 'चेक {int ten = 10 में कोड को लपेटें; int बी = 2147483647 + दस; } ', वह भी रनटाइम पर एक ही त्रुटि फेंक देगा। आप संकलन समय पर व्यवहार नहीं प्राप्त कर सकते हैं। –

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