INT_MIN-1 एक अंतर्प्रवाह या अतिप्रवाह है?


10

मुझे लगता है कि मुझे याद है कि मैं पढ़ रहा था

  • underflowइसका मतलब है कि आपके पास बहुत छोटा परिमाण है जिसे अब एक प्रकार से प्रस्तुत नहीं किया जा सकता है
  • overflowइसका मतलब है कि आपके पास बहुत बड़ा परिमाण है जिसे अब एक प्रकार से प्रस्तुत नहीं किया जा सकता है

हालाँकि, व्यवहार में मुझे लगता है कि शब्दों का इस्तेमाल ऐसे किया जाता है

  • underflowइसका मतलब है कि आपके पास बहुत छोटा मूल्य है जिसे अब एक प्रकार से प्रस्तुत नहीं किया जा सकता है
  • overflowइसका मतलब है कि आपके पास बहुत बड़ा मूल्य है जिसे अब एक प्रकार से प्रस्तुत नहीं किया जा सकता है

यहाँ उपयोग करने का सही अर्थ क्या है? क्या पूर्णांक और फ्लोटिंग पॉइंट प्रकारों के लिए शब्द अलग-अलग हैं?


2
आम तौर पर, "अंडरफ्लो" शब्द फ्लोटिंग पॉइंट अंकगणित के लिए आरक्षित है। पूर्णांक के साथ, मैं आमतौर पर "अतिप्रवाह" की परवाह किए बिना कहता हूं कि यह है INT_MIN - 1याINT_MAX + 1
चार्ल्स सल्विया

जवाबों:


15

मैं वास्तव में इस मामले पर एक "आधिकारिक" स्रोत नहीं ढूंढ सकता, ज्यादातर क्योंकि यह शायद सम्मेलन का मामला है, और शब्दावली अक्सर बहुत असंगत है। लेकिन, रॉबर्ट सीकॉर्ड के " C और C ++ में सुरक्षित कोडिंग " के कुछ अंश निम्नलिखित हैं : स्थिति की मेरी समझ:

पूर्णांक ओवरफ़्लो तब होता है जब कोई पूर्णांक अपने अधिकतम मूल्य से अधिक बढ़ जाता है या उसके न्यूनतम मूल्य 3 से कम हो जाता है । इंटेगर ओवरफ्लो अंतर्निहित प्रतिनिधित्व से निकटता से संबंधित हैं।

फुटनोट कहता है:

[३] अपने न्यूनतम मूल्य से परे एक पूर्णांक घटाना अक्सर एक पूर्णांक अंडरफ़्लो के रूप में जाना जाता है , हालांकि तकनीकी रूप से यह शब्द एक अस्थायी बिंदु स्थिति को संदर्भित करता है।

हम इसे पूर्णांक अतिप्रवाह कहते हैं इसका कारण यह है कि मूल्य का प्रतिनिधित्व करने के लिए केवल पर्याप्त स्थान उपलब्ध नहीं है । इस अर्थ में, यह एक बफर अतिप्रवाह के समान है (वास्तव में बफर सीमा को पार करने के अलावा, यह आमतौर पर चारों ओर के व्यवहार को प्रदर्शित करता है। *) इस दृष्टिकोण से, के बीच कोई वैचारिक अंतर नहीं है INT_MIN - 1और INT_MAX + 1। दोनों ही मामलों में intया तो मूल्य का प्रतिनिधित्व करने के लिए डेटा प्रकार में पर्याप्त जगह नहीं है - इसलिए हमारे पास एक अतिप्रवाह है

यह भी ध्यान रखना उपयोगी हो सकता है कि x86 और x86_64 प्रोसेसर आर्किटेक्चर में, झंडे रजिस्टर में एक अतिप्रवाह बिट शामिल है। अतिप्रवाह बिट सेट है जब एक हस्ताक्षरित पूर्णांक अंकगणितीय ऑपरेशन ओवरफ्लो होता है। अभिव्यक्ति INT_MIN - 1अतिप्रवाह बिट सेट करेगा। (कोई "अंडरफ्लो" बिट नहीं है।) स्पष्ट रूप से, एएमडी और इंटेल के इंजीनियर एक पूर्णांक अंकगणितीय ऑपरेशन के परिणाम का वर्णन करने के लिए "ओवरफ्लो" शब्द का उपयोग करते हैं, जिसमें डेटा बिट में फिट होने के लिए बहुत सारे बिट्स होते हैं, भले ही वह हो। मूल्य संख्यात्मक रूप से बहुत बड़ा या बहुत छोटा है।


* वास्तव में, सी में, हस्ताक्षरित पूर्णांक अतिप्रवाह वास्तव में अपरिभाषित व्यवहार है, लेकिन जावा जैसी अन्य भाषाओं में, दोनों के पूरक अंकगणित चारों ओर लपेटेंगे।


6

यह एक अतिप्रवाह है। पूर्णांक मानों के लिए अंडरफ़्लो नहीं होता है।

एक अतिप्रवाह तब होता है जब एक मूल्य बहुत बड़ा होता है (शून्य से बहुत दूर) विशिष्ट प्रकार द्वारा प्रतिनिधित्व किया जाना है, और एक अंडरफ्लो है जब यह बहुत छोटा है (शून्य के पास भी)।

जैसा कि शून्य (1 और -1) के निकटतम पूर्णांक मान अभी भी किसी भी पूर्णांक चर (एक से अधिक बिट के साथ एक हस्ताक्षरित पूर्णांक मानकर) द्वारा दर्शाया जा सकता है, एक अंडरफ़्लो नहीं हो सकता है।

अधःप्रवाह पर विकिपीडिया लेख एक काफी स्पष्ट विवरण नहीं है:

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


यह नोट करना उपयोगी हो सकता है कि underflowअक्सर विशेष रूप से उस विशेष स्थिति को संदर्भित करने के लिए उपयोग किया जाता है जहां एक संख्या का परिमाण सबसे छोटे संभव गैर-शून्य मान से छोटा होता है, लेकिन गैर-शून्य मानों के बीच सबसे छोटी संभव दूरी से बड़ा होता है - अन्य में शब्द, मामले जहां संख्याएँ विकी लेख को "अंडरफ्लो गैप" कहती हैं। IEEE-744-अनुरूप कार्यान्वयन पर, सबसे छोटी अभाज्य संख्या संख्याओं के बीच सबसे छोटे प्रतिनिधित्व योग्य अंतर के बराबर होती है, इसलिए ऐसे अंडरफ्लोज़ नहीं हो सकते हैं, लेकिन पीसी की दुनिया के बाहर, सभी प्रणालियाँ IEEE-compliant नहीं हैं।
सुपरकैट

2

पूर्णांक गणित में, अतिप्रवाह का अर्थ बहुत बड़े और बहुत छोटे मूल्यों दोनों से है। फ़्लोटिंग पॉइंट में, अतिप्रवाह बहुत बड़े प्रतिपादक को संदर्भित करता है, और अंतर्प्रवाह बहुत छोटे प्रतिपादक को संदर्भित करता है।

वास्तव में, पूर्णांक प्रकारों के लिए, सीपीयू के पास ओवरफ्लो और अंडरफ्लो के बीच अंतर बताने का कोई तरीका नहीं है। निम्नलिखित 16-बिट जोड़ें:

  0x8000 (unsigned 32768, or signed -32767)
+ 0xFFFF (unsigned 65535, or signed -1)
--------
  0x7FFF (32767, the carried '1' is lost)

सीपीयू में ओवरफ्लो झंडा, निश्चित रूप से, इस ऐड के बाद सेट हो जाएगा। हस्ताक्षरित गणित का उपयोग करना, परिणाम बहुत छोटा है (-32768)। अहस्ताक्षरित गणित का उपयोग करते हुए, परिणाम बहुत बड़ा है (0x17FFF)। चूंकि 2 का पूरक गणित हस्ताक्षरित और अहस्ताक्षरित प्रकारों के लिए समान है, overflowइसलिए इसका मतलब बहुत बड़े और बहुत छोटे मान दोनों के लिए मजबूर किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.