![](/img/trans.png)
[英]Converting to int16, int32, int64 - how do you know which one to choose?
[英]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
類型變量?
如何在運行時檢查byte
, Int16
, Int32
和float
的乘法運算溢出 ? 我的要求是在發生溢出時,用數據類型的最小值或最大值替換目標變量。
您遇到什么錯誤? 在這個例子中
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.