2017-08-12 18 views
9
void main() { 
    int i; 
    if (i < 0) { i = -i; }; 
} 

क्या कोई मुझे यह समझने में सहायता कर सकता है कि उपरोक्त कार्यक्रम में ओवरफ़्लो क्यों हो सकता है?निम्नलिखित प्रोग्राम में ओवरफ़्लो क्यों हो सकता है?

+4

अपरिभाषित व्यवहार। चर शुरू नहीं किया गया है। और सबसे नकारात्मक संभावित पूर्णांक को नकारने से दो के पूरक अंकगणित –

+1

में समान मूल्य उत्पन्न होता है, 2 के पूरक में, | INT_MIN | > INT_MAX – BLUEPIXY

+1

जब i == INT_MIN' दो के पूरक नोटेशन में। –

उत्तर

13

एक अतिप्रवाह हो सकता है क्योंकि दो पूरक में पूर्णांक प्रतिनिधित्व की सीमा सममित नहीं है: सबसे छोटे नकारात्मक संख्या की परिमाण का प्रतिनिधित्व किया जा सकता है जो उच्चतम सकारात्मक संख्या का प्रतिनिधित्व किया जा सकता है, साथ ही साथ। उदाहरण के लिए, 32-बिट सिस्टम पर मान -2,147,483,648 और 2,147,483,647 हैं। यही कारण है कि -2,147,483,648 को नकारने का परिणाम बह जाएगा: नकारात्मकता का परिणाम, सकारात्मक मूल्य 2,147,483,648, उसी आकार के int में प्रदर्शित नहीं किया जा सकता है।

ध्यान दें कि इस समस्या का प्रतिलोम सच नहीं है: एक सकारात्मक संख्या को नकारने एक अतिप्रवाह में परिणाम नहीं होगा:

if (i > 0) { i = -i; } // No overflow here 
+2

@ टॉम कृपया ध्यान दें कि एमएसवीसी ने 'सीमा.h' में' # परिभाषित INT_MIN (-2147483647 - 1) 'है। –

+0

समझते हैं ... बहुत बहुत धन्यवाद – Tom

1

कारण एक पूर्णांक अतिप्रवाह के लिए जब एक गणित आपरेशन एक अंकीय मान बनाने का प्रयास करता है वह सीमा के बाहर है जिसे किसी दिए गए बिट्स के साथ प्रदर्शित किया जा सकता है, या तो अधिकतम प्रतिनिधित्व करने योग्य मूल्य से अधिकतम या उससे कम से बड़ा।

  • ठीक है, आपके मामले में परिवर्तनीय i प्रारंभ नहीं हुआ है। तो यहां क्या होगा कि पूर्णांक प्रकार के परिवर्तनीय i को आवंटित स्मृति स्थान में कुछ कचरा मूल्य होगा।
  • यदि किसी भी मौके पर स्मृति पते में अधिकतम संभव पूर्णांक मान होता है जो -2^31(-2,147,483,648) है तो इस मान को अस्वीकार करने के परिणामस्वरूप पूर्णांक ओवरफ़्लो होगा।

मुझे उम्मीद है कि इससे मदद मिलती है।

1

स्टैक में "i" का आपका मान, मुख्य प्रारंभ होने पर अपरिभाषित है। स्टार्ट-अप कोड जो मुख्य() से पहले चलता है उसे बुलाया जा सकता है।

Kashif ने कहा कि नकारात्मक पूर्णांक गैर-ऋणात्मक पूर्णांक से एक मान कम हो सकते हैं क्योंकि नकारात्मक को शून्य के लिए कमरे छोड़ने की आवश्यकता नहीं है। साइन बिट में एक "1", सभी शेष बिट्स शून्य के साथ, साइन ओवर होने पर ओवरफ़्लो का कारण बनता है।

16 बिट में: -0x8000 == ~ 0x8000 + 1 == 0x7FFF + 1 == 0x8000
// "-" नकारात्मक मूल्य == उलट + 1 == उल्टे + 1 == अंतिम एक ही

है

इस मूल्य का संभावित हुड कम है, लेकिन वर्तमान है। यह तब तक नहीं होगा जब तक कि ढेर नाराज संख्या में शामिल न हो।

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