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

时间:2016-03-20 17:17:35

标签: c# .net bit-manipulation addition

我的意思是,我可以构建一般程序

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 s的情况下,我可以查看(a+b) < a(a+b) < b。例如我知道255+1溢出,因为0小于2551时的结果。或者,我可以将它们转换为更大的数据类型并检查

return ((int)a + (int)b) > (int)Byte.MaxValue;

但这不适用于所有拥有+运营商的数字类型。

1 个答案:

答案 0 :(得分:4)

最简单的方法是显式检查溢出并捕获相关的异常(伪代码 - 见下文):

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.