У меня был этот странный опыт с проблемой номер 10 на Euler Проекта (большой сайт между прочим). Присвоение состояло в том, чтобы вычислить сумму всех простых чисел ниже два миллиона.
Я использовал интервал за сумму, и мой algorith произвел ответ, но когда я вставил его для проверки ответа, это было неправильно.
Оказалось, что результат был слишком большим для помещений в интервал, но разве это не вызовет водосливную ошибку или что-то? Вместо этого это просто возвратило значение далеко из реального ответа.
Когда я изменил тип на длинный, все было целой и невредимой легкой рыбачьей плоскодонкой.
C # Целые операции не бросают исключения при переполнении по умолчанию. Вы можете добиться этого через настройки проекта или, сделав вычисление
:
int result = checked(largeInt + otherLargeInt);
Теперь операция будет бросать.
Противоположность не проверяет
, что делает любую эксплуатацию явно не проверять. Очевидно, что это имеет смысл, когда вы получили проверенные операции, включенные в настройках проекта.
В C # AN OverflowException
не брошен (в VB, исключение выдается по умолчанию).
Чтобы получить тлупление, вы должны встроить свой код в , проверенном
контекст:
byte value = 241;
checked
{
try
{
sbyte newValue = (sbyte) value;
Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.",
value.GetType().Name, value,
newValue.GetType().Name, newValue);
}
catch (OverflowException)
{
Console.WriteLine("Exception: {0} > {1}.", value, SByte.MaxValue);
}
}
MSDN более подробно объясняет:
для арифметического, литья или Операция преобразования, чтобы бросить OverflowException, операция должна происходят в проверенном контексте. К по умолчанию, арифметические операции и Переполняется в Visual Basic Checked; в C #, они нет. Если операция происходит в неконкуренном контексте, результат усекается путем отказа от любого биты с высоким порядком, которые не вписываются в Тип назначения.
я уже добавил cmt, но для некоторых из вас это может быть интересно:
msdn говорит нам:
Целочисленное арифметическое переполнение также выбрасывает OverflowException или отбрасывает наиболее значимые части результат
но
десятичное арифметическое переполнение всегда бросает OverflowException.
также
Когда происходит целочисленное переполнение, что случается это в зависимости от исполнения контекст, который можно проверить или бесконтрольно. В проверенном контексте OverflowException брошен. В непроверенный контекст, самый существенные результаты отброшен и казнь продолжается. Таким образом, C# дает вам выбор обработка или игнорирование переполнения.
По умолчанию C # не проверяет арифметический переполнение на целых числах. Вы можете изменить это с помощью « / Checked
вариант компилятора или путем включения« проверки арифметического переполнения / нижнего превышения »в Visual Studio (Project Properties - Build - Advanced).
Вы можете использовать Checked
и , и
, чтобы переопределить по умолчанию в каждом конкретном случае. Если вы полагаетесь на проверку, имеющие место в кусочке кода, явно включив его с использованием не проверяют ключевые слова
, проверено
, было бы хорошей идеей.
int j = checked(i * 2);
checked
{
int j = i * 2;
// Do more stuff
}
Обратите внимание, что операции с плавающей запятой никогда не бросают OverflowException
, а десятичные операции всегда бросают OverflowException
. Смотрите также операторы C # .