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
добавляется к этому значению.