2016-03-20 4 views
-2

То, что я имею в виду, я мог построить общую процедуруМожно ли проверить, приводит ли добавление двух переменных к переполнению?

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, который меньше 255 и 1. Или я могу бросить их в более крупные типы данных и проверить, как

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

, но это не будет работать на всех числовых типов, которые имеют + оператора.

ответ

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.