Никакое водосливное исключение для интервала в C#?

У меня был этот странный опыт с проблемой номер 10 на Euler Проекта (большой сайт между прочим). Присвоение состояло в том, чтобы вычислить сумму всех простых чисел ниже два миллиона.

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

Оказалось, что результат был слишком большим для помещений в интервал, но разве это не вызовет водосливную ошибку или что-то? Вместо этого это просто возвратило значение далеко из реального ответа.

Когда я изменил тип на длинный, все было целой и невредимой легкой рыбачьей плоскодонкой.

58
задан Zero Piraeus 22 January 2015 в 17:18
поделиться

4 ответа

C # Целые операции не бросают исключения при переполнении по умолчанию. Вы можете добиться этого через настройки проекта или, сделав вычисление :

int result = checked(largeInt + otherLargeInt);

Теперь операция будет бросать.

Противоположность не проверяет , что делает любую эксплуатацию явно не проверять. Очевидно, что это имеет смысл, когда вы получили проверенные операции, включенные в настройках проекта.

90
ответ дан 24 November 2019 в 18:46
поделиться

В 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 #, они нет. Если операция происходит в неконкуренном контексте, результат усекается путем отказа от любого биты с высоким порядком, которые не вписываются в Тип назначения.

20
ответ дан 24 November 2019 в 18:46
поделиться

я уже добавил cmt, но для некоторых из вас это может быть интересно:

msdn говорит нам:

Целочисленное арифметическое переполнение также выбрасывает OverflowException или отбрасывает наиболее значимые части результат

но

десятичное арифметическое переполнение всегда бросает OverflowException.

также

Когда происходит целочисленное переполнение, что случается это в зависимости от исполнения контекст, который можно проверить или бесконтрольно. В проверенном контексте OverflowException брошен. В непроверенный контекст, самый существенные результаты отброшен и казнь продолжается. Таким образом, C# дает вам выбор обработка или игнорирование переполнения.

7
ответ дан 24 November 2019 в 18:46
поделиться

По умолчанию 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 # .

6
ответ дан 24 November 2019 в 18:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: