2015-05-07 13 views
0

我必須乘以一個乘法因子的變量。我的變量的數據類型將是一個字節,一個Int16,一個Int32或一個浮點數。溢出檢查哪些是可能的以及如何?字節,Int16,Int32和float

我試過checked按照Microsoft documentation的關鍵字使用情況,但沒有編譯。僅供參考,請參見下面的代碼片段:

byte mv = default(byte); mv = checked(Convert.ToByte(data.Value.ToString()) * Convert.ToByte(MultiplyingFactor));

我的困惑之中:不checked關鍵字overflow在運行時檢查只適用於integer類型變量?

如何檢查在運行時爲byteInt16Int32float倍增動作的溢出?我的要求是當溢出發生時用數據類型的最小值或最大值替換目標變量。

+0

什麼是編譯錯誤信息? – juharr

+0

處理'checked'執行上下文中發生的'OverflowException'。 –

回答

2

你得到了哪個錯誤?在這個例子中

byte b1 = 10; 
byte b2 = 10; 
byte b3 = checked(b1 * b2); 

你得到的編譯錯誤說:error CS0266: Cannot implicitly convert type 'int' to 'byte'.

同樣與

byte b3 = b1 * b2; 

發生這並不意味着它是做一些編譯時溢出檢查,只是結果兩個字節的乘法是一個int,而不是一個字節。

在你這裏顯示字節的情況下,你可以得到你想要的東西像這樣的東西,而是:

int res = b1 * b2; 
byte bRes = 0; 
if (res > byte.MaxValue) { 
    bRes = byte.MaxValue; 
} else if (res < byte.MinValue) { 
    bRes = byte.MinValue; 
} else { 
    bRes = (byte)res; 
} 
0

你需要轉換的計算結果返回給byte因爲它會完成爲整數:

mv = checked((byte)(Convert.ToByte(data.Value.ToString()) * Convert.ToByte(MultiplyingFactor))); 

雖然可以趕上System.OverflowException起因於該代碼,並設置字節值適當,我不認爲這是爲這個特殊的例子是正確的做法。

相反,我認爲你應該寫一個方法爲int轉換爲字節如下:

public static byte ClipToByte(int value) 
{ 
    if (value < byte.MinValue) 
     return byte.MinValue; 
    else if (value > byte.MaxValue) 
     return byte.MaxValue; 
    else 
     return (byte) value; 
} 

,你可以使用這樣的:

mv = ClipToByte(Convert.ToByte(data.Value.ToString()) * Convert.ToByte(MultiplyingFactor)); 

及寫其他類型的類似的方法。

0

我想我已經想通了,下面的單元測試都通過,除浮法溢出檢查的最後一個單元測試:

[TestMethod, ExpectedException(typeof(OverflowException))] 
    public void Test108_Byte_Overflow_Test() 
    { 
     byte max = byte.MaxValue; 
     byte mf = (byte)3; 
     byte b = checked((byte)(max * mf)); 
    } 

    [TestMethod, ExpectedException(typeof(OverflowException))] 
    public void Test108_Int16_Overflow_Test() 
    { 
     Int16 max = Int16.MaxValue; 
     Int16 mf = (Int16)3; 
     Int16 i = checked((Int16)(max * mf)); 
    } 

    [TestMethod, ExpectedException(typeof(OverflowException))] 
    public void Test109_Int32_Overflow_Test() 
    { 
     int max = int.MaxValue; 
     int mf = 3; 
     int i = checked(max * mf); 
    } 

    [TestMethod, ExpectedException(typeof(OverflowException))] 
    public void Test110_Float_Overflow_Test() 
    { 
     float max = float.MaxValue; 
     float mf = 3f; 
     float f = checked(max * mf); 
    } 
相關問題