回答
爲了發生溢出,兩個操作數必須是相同的符號。如果操作數的總和與操作數不同,則發生溢出。
bool overflow(int a, int b)
{
bool op_same_sign = (a < 0) == (b < 0);
bool sum_diff_sign = (a < 0) != (a + b < 0);
return op_same_sign && sum_diff_sign;
}
更簡潔...
bool overflow(int a, int b)
{
return ((a < 0) == (b < 0) && (a + b < 0) != (a < 0));
}
@Michael:術語整數下溢常被用來描述「INT_MIN」的「溢出」。同樣'std :: numeric_limits < float > :: min()'是一個非常小的值,而'std :: numeric_limits < int > :: min()'非常大。 – Potatoswatter
@Patatoswatter - 我們都知道這是不正確的。雖然在這種情況下,我顯然是不正確的:) –
這是未定義的行爲。 – Ladislav
__asm JNO notoverflow;
__asm jo溢出。
使用asm在這裏更方便。
int main()
{
int x = 2147483647;
x++;
__asm jo overflowed;
printf("Not Overflow\n");
if(0)
{
overflowed:
printf("Overflowed!\n");
}
return 0;
}
結果:溢出
正如其他人所說,如果結果是不同的符號比兩個操作數,發生補簽署溢出。
反過來也是如此。除非操作數是相同的符號(負或非負)並且結果相反,否則不會發生補碼簽名溢出。
不過,就個人而言,我更喜歡一個更簡單的方法:
int_type a = 12356, b = 98765432;
if (b > 0 && a > std::numeric_limits<int_type>::max() - b)
throw std::range_error("adding a and b would cause overflow");
if (b < 0 && a < std::numeric_limits<int_type>::min() - b)
throw std::range_error("adding a and b would cause underflow");
int_type c = a + b;
這將趕上符號和無符號溢/下溢,這是很容易看到發生了什麼。此外,C++中的整數有符號溢出不保證環繞,因爲不需要二進制補碼算術。有符號的整數溢出甚至可能會崩潰,儘管不太可能。所以就語言而言,最好在之前停止溢出它發生。 C++ 03§5/ 5:
如果表達式的評估過程中,其結果是不數學上或不在其類型可表示的值的範圍限定,該行爲是未定義的,除非這樣的表達是一個常數表達式(5.19),在這種情況下該程序是不合格的。 [注意:C++的大多數現有實現忽略整數溢出。 ...]
又見Boost Numeric Conversion庫,雖然我不知道它可以爲這個問題做任何事情,std::numeric_limits
不能。
您需要首先斷言'b'是非負數,否則再次遇到UB。 –
@BaummitAugen謝謝,修正。這裏有一點微妙之處,我希望解決方案完全明顯...... – Potatoswatter
差不多,但第二個「if」仍然是錯誤的。如果'b'是負數,'std :: numeric_limits < int_type > :: min()+ b'仍然是UB。 –
- 1. 如何捕捉C中的溢出長整數?
- 2. 如何捕捉Spring MVC中的整數溢出錯誤?
- 3. 捕捉堆棧溢出異常C#
- 4. 整數溢出C
- 5. 在C#中捕捉從C庫退出(#)
- 6. c整數溢出 - 環繞
- 7. 如何在C#中捕捉Alt-Tab等?
- 8. 如何捕捉與C#
- 9. 整數溢出如何在C中工作?
- 10. 如何在使用C或C++時防止整數溢出?
- 11. 溢出語言C中的短整數
- 12. 在C#中捕捉按鍵#
- 13. 如何在C++代碼中捕捉python標準輸出
- 14. 如何捕捉在routes.rb中
- 15. 整數溢出
- 16. 如何在Codeigniter中捕捉參數ajax?
- 17. 如何捕捉C#中的Lua異常#
- 18. 如何捕捉C#中的FtpWebResponse異常
- 19. 整數溢出/下溢
- 20. 如何檢查C中的整數溢出?
- 21. Python:捕捉double_scalars中的運行時溢出
- 22. 如何在MATLAB中捕捉函數的輸出?
- 23. 如何捕捉值已經在數據庫中使用C#
- 24. awk中的整數溢出
- 25. Java中整數的溢出
- 26. 如何檢查c中的32位有符號整數的整數溢出
- 27. 在C#中捕捉本機C++異常
- 28. 如何捕捉c中的所有輸出文本
- 29. 如何捕捉Python 3的標準輸出在C++代碼
- 30. 整數不溢出
取決於你正在求和的東西。提供代碼 –
實際上,交叉引用的問題是關於_any的默認數據類型_,儘管主要的例子是關於'float'而不是'int'的任何形式。答案肯定覆蓋了一些安全的整數庫,因此會幫助提問者。 –
另請參見:[在C/C++中檢測整數溢出的最佳方法](http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c)。 –