Ця вправа показує поведінку різних числових типів під час переповнення, тобто коли їхньої місткості не вистачає, щоб умістити значення, яке є результатом обчислення, наприклад арифметичної операції або приведення типу.
byte, ushort, uint, ulong) загортаються до нуля (максимальне значення типу + 1 діє як модуль), якщо, грубо кажучи, вони не перебувають усередині блоку checked, у якому випадку буде викинуто примірник OverflowException. int і long поводяться подібно, але загортаються до int.MinValue та long.minValue відповідно.int one = 1;
checked
{
int expr = int.MaxValue + one; // overflow exception is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // overflow exception is thrown
checked застосовується лише до виразів безпосередньо в блоці. Переповнення у викликаних функціях не перехоплюються.float і double набувають стану нескінченності, який можна перевірити за допомогою float.IsInfinity() тощо.double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
decimal спричинять викидання примірника OverflowException.unchecked для випадків, коли потрібно скасувати дію unchecked усередині блоку checked або коли було використано налаштування компілятора.Переповнення, які відбуваються без викидання винятку, можуть бути проблемними, бо зазвичай чим раніше вдається повідомити про помилкову ситуацію, тим краще.
Проблеми з переповненням для int і float можна помʼякшити, присвоївши результат змінній типу long, decimal або double.
Якщо великі цілі числа важливі для нашого коду, тоді можна скористатися типом BigInteger.
Звичайно, бувають випадки, коли цілком припустимо дозволити цілому числу загорнутися, особливо коли йдеться про беззнакові значення. Класичний приклад - геш-коди, які використовують розрядність числа як своєрідний модуль.
У кодових базах зазвичай можна помітити, що часто немає жодної перевірки там, де uint або ulong використовується як ідентифікатор, бо це вважають справою, яка не варта зусиль. Це стосується й випадків, коли із предметної області очевидно, що дуже великих значень не буде. Але погляньмо на це як на повчальну історію.