C# Language
Przelewowy
Szukaj…
Całkowitą przepełnienie
Jest maksymalna pojemność, którą może zapisać liczba całkowita. A kiedy przekroczysz ten limit, powróci on do ujemnej strony. Dla int
jest to 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
W przypadku liczb całkowitych spoza tego zakresu należy użyć przestrzeni nazw System.Numerics, która ma typ danych BigInteger. Sprawdź poniższy link, aby uzyskać więcej informacji https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
Przepełnienie podczas pracy
Przepełnienie występuje również podczas operacji. W poniższym przykładzie x jest liczbą int
, 1 jest domyślnie liczbą int
. Dlatego dodatek jest int
. Rezultatem będzie int
. I to się przepełni.
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
Można temu zapobiec, używając 1L. Teraz 1 będzie long
a dodatek będzie long
dodatkiem
int x = int.MaxValue; //MaxValue is 2147483647
long y = x + 1L; //It will be OK
Console.WriteLine(y); //Will print 2147483648
Zamówienia są ważne
W poniższym kodzie występuje przepełnienie
int x = int.MaxValue;
Console.WriteLine(x + x + 1L); //prints -1
Podczas gdy w poniższym kodzie nie ma przepełnienia
int x = int.MaxValue;
Console.WriteLine(x + 1L + x); //prints 4294967295
Wynika to z uporządkowania operacji od lewej do prawej. W pierwszym kodzie fragment x + x
przelewa się, a następnie staje się long
. Z drugiej strony x + 1L
staje się long
a następnie x
jest dodawane do tej wartości.