是否有一种检查给定数据类型(uint32,int等)溢出或下溢的通用方法?检查C++下溢/溢出?
我做这样的事情:
uint32 a,b,c;
... //initialize a,b,c
if(b < c) {
a -= (c - b)
}
当我打印一些迭代之后,它显示了一大批像:4294963846.
是否有一种检查给定数据类型(uint32,int等)溢出或下溢的通用方法?检查C++下溢/溢出?
我做这样的事情:
uint32 a,b,c;
... //initialize a,b,c
if(b < c) {
a -= (c - b)
}
当我打印一些迭代之后,它显示了一大批像:4294963846.
要检查溢出/下溢算术检查结果与原始值相比较。
uint32 a,b;
//assign values
uint32 result = a + b;
if (result < a) {
//Overflow
}
针对您的特殊检查是:
if (a > (c-b)) {
//Underflow
}
我想,如果我想做的事,我会作出这样的模拟数据类型的类,并且做手工(这将是缓慢的我会想象)
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 ...
我做了一个类似的事情,用指针来检查内存写入边界的位置。非常慢,但确实发现内存在损坏的地方
正在寻找一种更简单的方法......但无论如何,感谢这.. – Legend 2010-03-08 04:54:13
有一个[称为SafeInt]的版本(http://safeint.codeplex )/今晚我了解到。在大多数情况下使用类似的东西可能不是一个坏主意,只是不在性能严重的代码中。 – HostileFork 2012-06-17 05:04:10
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)
[如何检测整数溢出在C/C++?](http://stackoverflow.com/q/199333/995714) – 2016-03-31 06:52:47