2010-03-08 108 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)