2010-03-08 7 views
10

क्या किसी दिए गए डेटा प्रकार (uint32, int आदि) के ओवरफ़्लो या अंडरफ़्लो की जांच करने का कोई सामान्य तरीका है? 4294963846.सी ++ में अंडरफ्लो/ओवरफ्लो की जांच कर रहा है?

+0

[पूर्णांक ओवरफ़्लो का पता कैसे लगाएं सी/सी ++ में?] (http://stackoverflow.com/q/199333/995714) –

उत्तर

9

गणित में अधिक/अधःप्रवाह की जांच करने के परिणाम की जाँच करें:

uint32 a,b,c; 
... //initialize a,b,c 
if(b < c) { 
    a -= (c - b) 
} 

जब मैं प्रिंट एक कुछ पुनरावृत्तियों के बाद, यह की तरह एक बड़ी संख्या प्रदर्शित करता है:

मैं कुछ इस तरह कर रहा हूँ मूल मूल्यों की तुलना में।

uint32 a,b; 
//assign values 
uint32 result = a + b; 
if (result < a) { 
    //Overflow 
} 

अपने विशिष्ट के लिए जांच होगी:

if (a > (c-b)) { 
    //Underflow 
} 
+0

धन्यवाद। यह अब के लिए ठीक काम करता प्रतीत होता है ... – Legend

+0

यह तथ्य है कि अतिप्रवाह के मामले में उत्तर हमेशा एक हस्ताक्षरित (नकारात्मक पूर्णांक) होगा? – Faizan

+0

हस्ताक्षरित पूर्णांक का ओवरफ़्लो कभी भी हस्ताक्षरित नहीं होगा, बल्कि यह मूल मानों में से किसी एक छोटे से हस्ताक्षरित पूर्णांक होगा। –

4

मैं अगर मैं यह है कि मैं एक वर्ग है कि डेटा प्रकार simulates होगा करना चाहता था लगता है, और यह मैन्युअल रूप से करना (जो धीमी गति से किया जाएगा मैं कल्पना कर सकते हैं)

class MyInt 
{ 
    int val; 
    MyInt(const int&nval){ val = nval;} // cast from int 
    operator int(){return val;} // cast to int 

    // then just overload ALL the operators... putting your check in 
}; 

//typedef int sint32; 
typedef MyInt sint32; 

यह उससे कहीं अधिक मुश्किल हो सकता है, तो आप एक typedef के बजाय परिभाषित एक का उपयोग कर को समाप्त करना हो सकता है ...

मैंने पॉइंटर्स के साथ एक समान बात की जांच की कि सीमाएं किनारे के किनारे लिखी गई थीं। बहुत धीमी लेकिन पता चला कि स्मृति कहाँ दूषित हो रही थी

+0

में अपरिभाषित व्यवहार है, एक आसान दृष्टिकोण की तलाश में था ... लेकिन किसी भी मामले में, इसके लिए धन्यवाद .. – Legend

+0

इस का एक संस्करण है [SafeInt कहा जाता है] (http: //safeint.codeplex .com /) कि मैंने आज रात के बारे में सीखा। संभवतया उस समय कुछ ऐसा करने का बुरा विचार नहीं है, केवल प्रदर्शन महत्वपूर्ण कोड में नहीं। – HostileFork

2

प्रमाण signed integer overflow दोनों के लिए एक अच्छा संदर्भ है जो अपरिभाषित व्यवहार और unsigned wrapping है जो वे सभी ऑपरेटरों को कवर नहीं करते हैं।

दस्तावेज़ घटाव में अहस्ताक्षरित रैपिंग के लिए निम्नलिखित जाँच कोड प्रदान करता है पूर्व शर्त का उपयोग कर इस प्रकार है:

void func(unsigned int ui_a, unsigned int ui_b) { 
    unsigned int udiff; 
    if (ui_a < ui_b){ 
    /* Handle error */ 
    } else { 
    udiff = ui_a - ui_b; 
    } 
    /* ... */ 
} 

और बाद की स्थिति के साथ:

void func(unsigned int ui_a, unsigned int ui_b) { 
    unsigned int udiff = ui_a - ui_b; 
    if (udiff > ui_a) { 
    /* Handle error */ 
    } 
    /* ... */ 
} 

आप gcc 5 हैं, तो आप उपयोग कर सकते हैं __builtin_sub_overflow :

__builtin_sub_overflow(ui_a, ui_b, &udiff) 
संबंधित मुद्दे