2013-01-16 43 views
6

गणितीय ऑपरेशन करने के बाद, दो पूर्णांक गुणा करने के लिए, क्या सीपीयू में सी ++ के साथ ओवरफ्लो फ्लैग रजिस्टर तक पहुंच बनाना संभव है? यदि ओवरफ्लो की जांच करने के लिए अन्य तेज़ तरीके क्या नहीं हैं?क्या सीपीयू में सी ++ के साथ ओवरफ्लो फ्लैग रजिस्टर तक पहुंच बनाना संभव है?

+2

यह जांचें http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc – acrilige

+0

@acrilige धन्यवाद, कि यह जांचें मेरे प्रश्न के दूसरे भाग का जवाब देता है, गणना करने के बाद अतिप्रवाह की जांच कैसे करें? –

+0

स्पष्ट कारणों से मानक, पोर्टेबल तरीके से ओवरफ्लो ध्वज रजिस्टर को सीधे एक्सेस करना असंभव है। हालांकि, आप यह निर्धारित कर सकते हैं कि एक ऑपरेशन थोड़ा काम से बह जाएगा या नहीं, और इसे जांचने या गैर-मानक गैर-पोर्टेबल तरीके से ओवरफ़्लो का पता लगाने के तरीके हैं। –

उत्तर

6

नहीं, आम तौर पर यह असंभव है। कुछ CPUs में ऐसा ध्वज नहीं है (उदा। एमआईपीएस)।

link टिप्पणियों में से एक में प्रदान किया गया है कि आप ओवरफ्लो चेक कैसे कर सकते हैं इस पर विचार करेंगे।

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

4

मैं हर उचित मामले में इस पढ़ने की अनुशंसा करता हूं। Optimizing software in C++ से

इंटीजर ओवरफ़्लो एक और सुरक्षा समस्या है। आधिकारिक सी मानक कहता है कि ओवरफ़्लो के मामले में हस्ताक्षरित पूर्णांक का व्यवहार "अपरिभाषित" है। यह संकलक को ओवरफ्लो को अनदेखा करने या मानने की अनुमति देता है जो ऐसा नहीं होता है। जीएनयू कंपाइलर के मामले में, धारणा पर हस्ताक्षर किए गए पूर्णांक ओवरफ़्लो में दुर्भाग्यपूर्ण परिणाम होता है जिसके परिणामस्वरूप यह संकलक को ओवरफ़्लो चेक को ऑप्टिमाइज़ करने की अनुमति देता है। इस समस्या के खिलाफ कई संभावित उपचार हैं: (1) इससे पहले ओवरफ़्लो की जांच करें, (2) हस्ताक्षरित पूर्णांक का उपयोग करें - उन्हें विकल्प -ftrapv के साथ ट्रैप पूर्णांक ओवरफ़्लो की गारंटी है, लेकिन यह बेहद अक्षम है, (4) विकल्प -Wstrict-overflow=2 के साथ ऐसे अनुकूलन के लिए एक कंपाइलर प्राप्त करें, या (5) ओवरफ्लो व्यवहार को -fwrapv या -fno-strict-overflow विकल्प के साथ अच्छी तरह परिभाषित करें।

0

यह संभव है कि आप दो कारणों के लिए क्या करना चाहते हैं नहीं है:

  1. नहीं हर सीपीयू एक अतिप्रवाह झंडा
  2. सी का उपयोग कर ++ वहाँ वास्तव में अतिप्रवाह झंडा तक पहुँचने के लिए कोई रास्ता नहीं है

लोगों द्वारा पोस्ट की गई अतिप्रवाह जांच युक्तियाँ उपयोगी हो सकती हैं।

यदि आप वास्तव में तेज़ कोड लिखना चाहते हैं जो दो पूर्णांक को गुणा करता है और ओवरफ्लो ध्वज की जांच करता है, तो आपको असेंबली का उपयोग करना होगा। यदि आप x86 के लिए कुछ उदाहरण चाहते हैं, तो