Контроль переполнения в C#
В прошлой заметке я уже упоминал о том, что по умолчанию при переполнении ведущие биты обнуляются, после чего результат "умещается" в доступных битах:
Однако это поведение может быть изменено и для этого мы можем воспользоваться ключевым словом
В таком случае вместо продолжения выполнения программы будет выброшено исключение
Синтаксис ключевого слова
Также стоит упомянуть о возможности изменения поведения при переполнении в настройках проекта:
#data_types
В прошлой заметке я уже упоминал о том, что по умолчанию при переполнении ведущие биты обнуляются, после чего результат "умещается" в доступных битах:
int n1 = int.MaxValue;
n1 = n1 + 1; // -2147483648 (перенос)
Однако это поведение может быть изменено и для этого мы можем воспользоваться ключевым словом
checked
:int n1 = int.MaxValue;
n1 = checked(n1 + 1); // OverflowException
В таком случае вместо продолжения выполнения программы будет выброшено исключение
OverflowException
, которое мы можем или корректно обработать, или проигнорировать для завершения программы.Синтаксис ключевого слова
checked
позволяет контролировать переполнение не только у конкретных операторов, но и целых блоков кода:checked
{
int n1 = int.MaxValue;
n1 = n1 + 1; // OverflowException
}
Также стоит упомянуть о возможности изменения поведения при переполнении в настройках проекта:
Project > Properties > Build > Advanced > Check for arithmetic overflow/underflow
.#data_types