2012-02-05 86 views
2

假设您有两个32位DWORD x和y,如何检测它们的总和是否会导致溢出,但不诉诸本地程序集来检查进位标志。我想要算术或二元运算符。我认为可能有一些测试方法来弄清楚。谢谢检测32位dword + dword进位/ C++

+0

[入门 “扛” 在X + Y]的可能重复(http://stackoverflow.com/questions/6092102/getting-carry-in-xy ) – 2012-02-05 11:52:40

回答

5

为什么不测试总和?

DWORD sum = x + y; 
bool const overflow = (sum < x); 
+1

随着x = 5和y = -5,尽管如此,你会变得真实没有溢出,因为总和小于x。 – Mario 2012-02-05 10:34:12

+1

@Mario:DWORD类型通常是无符号的。 – dreamlax 2012-02-05 10:35:49

+0

是的,这个假设是有效的。 – Mario 2012-02-05 10:37:12

1

应该非常节省承担,告诉我,如果我错过了任何情况下(这不会在编译器秉承上班C++ 98或更高版本的标准):

int overflowSum(DWORD a, DWORD b) { 
    return (b > 0) ? (a + b < a) : (a + b > a); 
} 

如果考虑您的DWORD是无符号,可以将其简化:

int overflowSum(DWORD a, DWROD b) { 
    return a + b < a; 
} 
+3

带符号的整数溢出是未定义的行为。 – dreamlax 2012-02-05 10:33:44

+0

由于未定义有符号整数溢出行为,因此编译器优化程序可以假设您的代码不会导致有符号整数溢出。请参阅[这里](http://www.airs.com/blog/archives/120)了解更多信息。 – dreamlax 2012-02-05 10:39:43

+0

dreamlax是正确的。在C++中未指定签名溢出行为,并且您的方法不仅取决于特定的CPU体系结构,还取决于当前所处的模式。非常不安全且不可移植。 – kkm 2012-02-05 10:42:34