2010-03-08 113 views
10

是否有一種檢查給定數據類型(uint32,int等)溢出或下溢的通用方法?檢查C++下溢/溢出?

我做這樣的事情:

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

當我打印一些迭代之後,它顯示了一大批像:4294963846.

+0

[如何檢測整數溢出在C/C++?](http://stackoverflow.com/q/199333/995714) – 2016-03-31 06:52:47

回答

9

要檢查溢出/下溢算術檢查結果與原始值相比較。

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

針對您的特殊檢查是:

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

謝謝。這似乎現在工作正常... – Legend 2010-03-08 04:46:29

+0

是這樣的事實,如果溢出答案將永遠是一個有符號(負整數)? – Faizan 2013-02-24 09:06:29

+0

無符號整數的溢出將永遠不會被簽名,相反,它將是一個比任何原始值小的無符號整數。 – 2013-02-27 20:04:30

4

我想,如果我想做的事,我會作出這樣的模擬數據類型的類,並且做手工(這將是緩慢的我會想象)

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 2010-03-08 04:54:13

+0

有一個[稱爲SafeInt]的版本(http://safeint.codeplex )/今晚我瞭解到。在大多數情況下使用類似的東西可能不是一個壞主意,只是不在性能嚴重的代碼中。 – HostileFork 2012-06-17 05:04:10

2

Cert對於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)