Поиск…


Целочисленное переполнение

Максимальная емкость, которую может хранить целое число. И когда вы перейдете этот предел, он вернется к отрицательной стороне. Для 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 добавляется к этому значению.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow