2012-02-05 41 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