2008-09-17 88 views

回答

3

一種可能性是使用任意si不會溢出/下溢的整數。否則,如果這是你真正關心的事情,並且如果你的語言允許,寫一個類似於整數的包裝類,但檢查每個操作是否溢出。你甚至可以讓它對調試版本進行檢查,並且對發佈版本進行優化。在像C++這樣的語言中,你可以這樣做,它的行爲幾乎和發佈版本的整數類似,但對於調試版本,你可以得到完整的運行時檢查。

class CheckedInt 
{ 
private: 
    int Value; 

public: 
    // Constructor 
    CheckedInt(int src) : Value(src) {} 

    // Conversions back to int 
    operator int&() { return Value; } 
    operator const int &() const { return Value; } 

    // Operators 
    CheckedInt operator+(CheckedInt rhs) const 
    { 
     if (rhs.Value < 0 && rhs.Value + Value > Value) 
      throw OverflowException(); 
     if (rhs.Value > 0 && rhs.Value + Value < Value) 
      throw OverflowException(); 
     return CheckedInt(rhs.Value + Value); 
    } 

    // Lots more operators... 
}; 

編輯:

原來有人doing this already for C++ - 目前實施的重點是爲Visual Studio,但看起來他們得到了海灣合作委員會的支持。

1

我寫了很多測試代碼來對我的代碼進行範圍/有效性檢查。這往往能夠捕捉到這些類型的情況 - 這絕對有助於我編寫更多防彈代碼。

1

使用高精度浮點數,如long double

+0

浮點(具有任何精度)引入了更難的一類問題,即精度損失。即`(x + 1.0)-x!= 1`。使用'長雙'只會降低頻率和幅度。 – MSalters 2009-09-14 10:19:07

1

我認爲您在列表中缺少一個非常重要的選項:爲作業選擇正確的編程語言。有許多編程語言沒有這些問題,因爲它們沒有固定大小的整數。

0

當選擇使用哪種語言而不是整數大小時,還有更重要的考慮因素。如果您不知道該值是否在界限內,則只需檢查輸入;如果情況非常罕見,則使用異常處理。

0

檢查不一致性的包裝在許多情況下都有意義。如果對兩個或多個整數的加法操作(即加法或乘法)導致的值小於操作數,那麼你就知道出了問題。每一個加法運算應遵循,

if (sum < operand1 || sum < operand2) 
    omg_error(); 

同樣應該在邏輯上導致較小的值,應檢查,看它是否被意外embiggin'd任何操作。

0

你是否研究過使用形式化方法來檢查代碼以證明它沒有溢出?一種稱爲抽象解釋的形式化方法技術可以檢查軟件的健壯性,以證明軟件不會遭受溢出,下溢,除以零,溢出或其他類似的運行時錯誤。這是一種徹底分析您的軟件的數學技術。該技術由Patrick Cousot在20世紀70年代首創。它成功用於診斷阿里安5號火箭的溢流狀況,溢流造成運載火箭的毀滅。溢出是在將浮點數轉換爲整數時引起的。你可以找到更多關於這項技術的信息here以及Wikipedia