C# Language
Rebosar
Buscar..
Desbordamiento de enteros
Hay una capacidad máxima que un entero puede almacenar. Y cuando superas ese límite, volverá al lado negativo. Para int
, es 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
Para los enteros fuera de este rango, use el espacio de nombres System.Numerics que tiene el tipo de datos BigInteger. Consulte el siguiente enlace para obtener más información https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
Desbordamiento durante la operación
El desbordamiento también ocurre durante la operación. En el siguiente ejemplo, x es un int
, 1 es un int
por defecto. Por lo tanto, la adición es una adición int
. Y el resultado será un int
. Y se desbordará.
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
Puedes evitar eso usando 1L. Ahora 1 será un long
y la adición será un long
agregado
int x = int.MaxValue; //MaxValue is 2147483647
long y = x + 1L; //It will be OK
Console.WriteLine(y); //Will print 2147483648
Asuntos de orden
Hay desbordamiento en el siguiente código.
int x = int.MaxValue;
Console.WriteLine(x + x + 1L); //prints -1
Mientras que en el siguiente código no hay desbordamiento
int x = int.MaxValue;
Console.WriteLine(x + 1L + x); //prints 4294967295
Esto se debe a la ordenación de izquierda a derecha de las operaciones. En el primer fragmento de código, x + x
desborda y después de eso se vuelve long
. Por otro lado, x + 1L
vuelve long
y luego se agrega x
a este valor.