是否可以检查添加两个变量是否会导致溢出?

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 的结果小于 2551。或者,我可以将它们转换为更大的数据类型并检查

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,编译器不理解 + 运算符。这里有两个选项:

  1. 声明方法的所有可能版本,即Overflows(int, int)Overflows(byte, byte)
  2. 使用类型比较和转换:

    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.