C# Language
перелив
Поиск…
Целочисленное переполнение
Максимальная емкость, которую может хранить целое число. И когда вы перейдете этот предел, он вернется к отрицательной стороне. Для int это 2147483647
int x = int.MaxValue; //MaxValue is 2147483647
x = unchecked(x + 1); //make operation explicitly unchecked so that the example also works when the check for arithmetic overflow/underflow is enabled in the project settings
Console.WriteLine(x); //Will print -2147483648
Console.WriteLine(int.MinValue); //Same as Min value
Для любых целых чисел из этого диапазона используйте пространство имен System.Numerics, которое имеет тип данных BigInteger. Проверьте ссылку ниже для получения дополнительной информации https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
Переполнение во время работы
Переполнение также происходит во время операции. В следующем примере x - это int , 1 - int по умолчанию. Поэтому добавление является добавлением int . И результатом будет int . И это переполнится.
int x = int.MaxValue; //MaxValue is 2147483647
long y = x + 1; //It will be overflown
Console.WriteLine(y); //Will print -2147483648
Console.WriteLine(int.MinValue); //Same as Min value
Вы можете предотвратить это, используя 1L. Теперь 1 будет long и добавление будет long дополнением
int x = int.MaxValue; //MaxValue is 2147483647
long y = x + 1L; //It will be OK
Console.WriteLine(y); //Will print 2147483648
Вопросы для заказа
Переполнение в следующем коде
int x = int.MaxValue;
Console.WriteLine(x + x + 1L); //prints -1
Если в следующем коде нет переполнения
int x = int.MaxValue;
Console.WriteLine(x + 1L + x); //prints 4294967295
Это связано с упорядочением операций слева направо. В первом фрагменте кода x + x переполняется, и после этого он становится long . С другой стороны, x + 1L становится long и после этого x добавляется к этому значению.