是否可以检查添加两个变量是否会导致溢出?
Is it possible to check whether addition of two variables results in overflow?
我的意思是,我可以构建一个通用程序吗
public bool Overflows<T> ( T a, T b )
{
// returns true or false based on whether
// a + b overflows
}
我可以像
byte b1 = 255,
b2 = 1;
Console.WriteLine("Does {0} + {1} oveflow? {2}", b1, b2, Overflows(b1,b2) ? "Yes : "No"); // Answer should be "Yes" here
???
我想在 byte
的情况下,我可以查看 (a+b) < a
和 (a+b) < b
。例如我知道 255+1
溢出是因为 0
的结果小于 255
和 1
。或者,我可以将它们转换为更大的数据类型并检查
return ((int)a + (int)b) > (int)Byte.MaxValue;
但这不适用于所有具有 +
运算符的数字类型。
最简单的方法是显式检查溢出并捕获相关异常(伪代码——见下文):
public bool Overflows<T> ( T a, T b )
{
{
// the 'checked' keyword ensures an OverflowException is thrown
// as a result of a real integer overflow happening
c = checked(a + b); // * with 'T' this won't compile, see below
return false;
}
catch (System.OverflowException e)
{
return true;
}
}
但是,对于泛型类型参数 T
,编译器不理解 +
运算符。这里有两个选项:
- 声明方法的所有可能版本,即
Overflows(int, int)
、Overflows(byte, byte)
等
使用类型比较和转换:
if (typeof(T) == typeof(int))
int i = checked((int)a + (int)b);
else if (typeof(T) == typeof(byte))
byte b = checked((byte)a + (byte)b);
… etc.
我的意思是,我可以构建一个通用程序吗
public bool Overflows<T> ( T a, T b )
{
// returns true or false based on whether
// a + b overflows
}
我可以像
byte b1 = 255,
b2 = 1;
Console.WriteLine("Does {0} + {1} oveflow? {2}", b1, b2, Overflows(b1,b2) ? "Yes : "No"); // Answer should be "Yes" here
???
我想在 byte
的情况下,我可以查看 (a+b) < a
和 (a+b) < b
。例如我知道 255+1
溢出是因为 0
的结果小于 255
和 1
。或者,我可以将它们转换为更大的数据类型并检查
return ((int)a + (int)b) > (int)Byte.MaxValue;
但这不适用于所有具有 +
运算符的数字类型。
最简单的方法是显式检查溢出并捕获相关异常(伪代码——见下文):
public bool Overflows<T> ( T a, T b )
{
{
// the 'checked' keyword ensures an OverflowException is thrown
// as a result of a real integer overflow happening
c = checked(a + b); // * with 'T' this won't compile, see below
return false;
}
catch (System.OverflowException e)
{
return true;
}
}
但是,对于泛型类型参数 T
,编译器不理解 +
运算符。这里有两个选项:
- 声明方法的所有可能版本,即
Overflows(int, int)
、Overflows(byte, byte)
等 使用类型比较和转换:
if (typeof(T) == typeof(int)) int i = checked((int)a + (int)b); else if (typeof(T) == typeof(byte)) byte b = checked((byte)a + (byte)b); … etc.