簡體   English   中英

溢出檢查其中哪些是可能的,以及如何進行? 字節,Int16,Int32和浮點數

[英]Overflow checking of which of these is possible and how? byte, Int16, Int32 and float

我必須將一個乘數與一個變量相乘。 我的變量的數據類型將是字節,Int16,Int32或浮點數。

我嘗試根據Microsoft文檔 checked關鍵字的用法,但未編譯。 作為參考,請參見下面的代碼片段:

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

我的困惑是:運行時checked關鍵字溢出檢查是否僅適用於integer類型變量?

如何在運行時檢查byteInt16Int32float的乘法運算溢出 我的要求是在發生溢出時,用數據類型的最小值或最大值替換目標變量。

您遇到什么錯誤? 在這個例子中

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;
}

您需要將計算結果轉換回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));  

並為其他類型編寫類似的方法。

我想我已經解決了,以下單元測試通過了,除了最后一個用於浮點溢出檢查的單元測試:

    [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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM