c# vb.net overflowexception

c# - La operación aritmetica resulto en un desbordamiento.(Sumando enteros)



vb.net overflowexception (8)

No puedo entender este error:

En esta llamada al método SetVolume, Volume = 2055786000 y size = 93552000. Volume es una propiedad Integer, y el tamaño también es Integer, como puede ver.

La clase es una clase parcial de una clase de entidad dbml, sin embargo, esta propiedad de volumen NO es una columna en la base de datos, existe solo en la clase parcial, como una "propiedad de objeto de negocio".

Ver detalle muestra:

Datos> Elemento : para evaluar una propiedad indexada, la propiedad debe estar calificada y los argumentos deben ser proporcionados explícitamente por el usuario.

¿Qué puede causar esto ...?


2055786000 + 93552000 = 2149338000, que es mayor que 2 ^ 31. Entonces, si está utilizando enteros con signo codificados en 4 bytes, el resultado de la operación no se ajusta y obtiene una excepción de desbordamiento.


El tamaño máximo para un int es 2147483647. Puedes usar un Int64 / Long que es mucho más grande.


El valor entero del resultado está fuera del rango que puede contener un tipo de datos entero.

Intenta usar Int64


El valor máximo de fo int es 2147483647, así que 2055786000 + 93552000> 2147483647 y causó desbordamiento


Este error se produjo cuando un valor se devolvió como -1. # IND debido a una división por cero. Más información sobre las excepciones de punto flotante IEEE en C ++ aquí en SO y por John Cook

Para quien ha bajado esta respuesta (y no especificó por qué), la razón por la que esta respuesta puede ser importante para algunos es que una división por cero conducirá a un número infinitamente grande y por lo tanto un valor que no cabe en Int32 (o incluso Int64). Por lo tanto, el error que reciba será el mismo (la operación aritmética produjo un desbordamiento) pero la razón es ligeramente diferente.


Por simplicidad usaré bytes:

byte a=250; byte b=8; byte c=a+b;

si a, b y c fueran ''int'', esperaría 258, pero en el caso de ''byte'', el resultado esperado sería 2 (258 y 0xFF), pero en una aplicación de Windows obtendrá una excepción, en una la consola no puede (no, pero esto puede depender del IDE, uso SharpDevelop).

A veces, sin embargo, se desea ese comportamiento (por ejemplo, solo te importan los 8 bits más bajos del resultado).

Podrías hacer lo siguiente:

byte a=250; byte b=8; byte c=(byte)((int)a + (int)b);

De esta manera, tanto ''a'' como ''b'' se convierten a ''int'', se agregan y se vuelven a convertir en ''byte''.

Para estar en el lado seguro, también puede intentar:

... byte c=(byte)(((int)a + (int)b) & 0xFF);

O si realmente quieres ese comportamiento, la forma mucho más sencilla de hacer lo anterior es:

unchecked { byte a=250; byte b=8; byte c=a+b; }

O declare sus variables primero, luego haga los cálculos en la sección ''sin marcar''.

Alternativamente, si desea forzar la verificación de desbordamiento, use ''revisado'' en su lugar.

Espero que esto aclare las cosas.

Nurchi

PD

Créeme, esa excepción es tu amiga :)


El valor máximo de un entero (que está firmado) es 2147483647 . Si ese valor se desborda, se lanza una excepción para evitar el comportamiento inesperado de su programa.

Si esa excepción no fuera lanzada, tendrías un valor de -2145629296 para tu Volume , que probablemente no sea deseado.

Solución: Use un Int64 para su volumen. Con un valor máximo de 9223372036854775807 , probablemente estés más seguro.


int.MaxValue = 2147483647 2055786000 + 93552000 = 2149338000 > int.MaxValue

Por lo tanto, no puede almacenar este número en un número entero. Podría usar el tipo Int64 que tiene un valor máximo de 9,223,372,036,854,775,807 .