Как проверить, находятся ли расчеты в диапазоне выше и ниже - PullRequest
2 голосов
/ 24 июня 2011

Я думал, что это будет очень легко, но это привело к необходимости большего количества проверок, чем я хотел бы.

У меня есть этот код:

        if (funcType == "Mul")
            return (val1 * val2) <= int.MaxValue && (val1 * val2) >= int.MinValue;

        if (funcType == "Add")
            return (val1 + val2) <= int.MaxValue && (val1 + val2) >= int.MinValue;

        if (funcType == "Sub")
            return (val1 - val2) <= int.MaxValue && (val1 - val2) >= int.MinValue;

        if (funcType == "Div")
            return (val1 / val2) <= int.MaxValue && (val1 / val2) >= int.MinValue;

Iнужно проверить, если в результате расчетов получается число в диапазоне типа значения int.

Например,

int val1 = 1777777774;
int val2 = 477778777;

При сложении вместе результат равен -2039410745 * 1012.* (допустимое значение int) Но это не правильный ответ (так сказать), и поэтому проверка не работает должным образом.

Я полагаю, я мог бы объявить val1 и val2 как longs, чтобы предотвратить отрицательные результаты изатем проведите сравнение.

Было бы это безопасно (я бы все еще беспокоился о том, что результат будет превышать пределы при умножении), есть ли лучший способ, о котором вы могли бы подумать?

Многиеспасибо, Кохан.

Ответы [ 2 ]

4 голосов
/ 24 июня 2011

Используйте ключевое слово checked и поймайте OverflowException.

1 голос
/ 24 июня 2011

Сначала преобразуйте один из аргументов в long, затем во всех вычислениях будут использованы 64-битные целые числа.

Опасность переполнения отсутствует, пока остаются ваши исходные аргументынабирается как int: long.MaxValue имеет более чем в два раза больше int.MaxValue * int.MaxValue, аналогично long.MinValue и int.MinValue * int.MaxValue.

long longVal1 = (long)val1;

if (funcType == "Mul")
    return (longVal1 * val2) <= int.MaxValue && (longVal1 * val2) >= int.MinValue;

if (funcType == "Add")
    return (longVal1 + val2) <= int.MaxValue && (longVal1 + val2) >= int.MinValue;

if (funcType == "Sub")
    return (longVal1 - val2) <= int.MaxValue && (longVal1 - val2) >= int.MinValue;

if (funcType == "Div")
    return (longVal1 / val2) <= int.MaxValue && (longVal1 / val2) >= int.MinValue;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...