C# 溢出检查哪些是可能的,如何进行?字节、Int16、Int32和浮点
我必须用一个乘法因子乘以一个变量。我的变量的数据类型可以是byte、Int16、Int32或float 我尝试了C# 溢出检查哪些是可能的,如何进行?字节、Int16、Int32和浮点,c#,.net,overflow,C#,.net,Overflow,我必须用一个乘法因子乘以一个变量。我的变量的数据类型可以是byte、Int16、Int32或float 我尝试了检查关键字的用法,但没有编译。有关参考信息,请参见下面的代码段: byte mv=默认值(字节); mv=选中(Convert.ToByte(data.Value.ToString())*Convert.ToByte(乘法因子)) 我的困惑是:checked运行时关键字溢出检查是否只适用于integer类型变量 如何在运行时检查byte、Int16、Int32和float的乘法操作溢出
检查
关键字的用法,但没有编译。有关参考信息,请参见下面的代码段:
byte mv=默认值(字节);
mv=选中(Convert.ToByte(data.Value.ToString())*Convert.ToByte(乘法因子))代码>
我的困惑是:checked
运行时关键字溢出检查是否只适用于integer
类型变量
如何在运行时检查byte
、Int16
、Int32
和float
的乘法操作溢出?我的要求是在发生溢出时用数据类型的最小值或最大值替换目标变量。您遇到了哪种错误?在这个例子中
byte b1 = 10;
byte b2 = 10;
byte b3 = checked(b1 * b2);
您得到的编译错误表明错误CS0266:无法将类型“int”隐式转换为“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;
}
int res=b1*b2;
字节bRes=0;
if(res>byte.MaxValue){
bRes=byte.MaxValue;
}else if(res
您需要将计算结果转换回字节,因为它将作为整数执行:
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;
}
并为其他类型编写类似的方法。我想我已经弄明白了,除了最后一个用于浮点溢出检查的单元测试外,以下单元测试都通过了:
[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);
}
编译错误消息是什么?处理执行上下文中发生的OverflowException
。
[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);
}