2011-01-21 19 views
18

que no puedo entender este error:La operación aritmética resultó en un desbordamiento. (enteros) Adición

En este llamado a SetVolume método, Volumen = 2055786000 y tamaño = 93552000. El volumen es una propiedad de entero, y el tamaño es de enteros también, como puedes 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, solo existe en la clase parcial como "propiedad de objeto comercial".

Ver detalles espectáculos:

datos> Punto: Con el fin de evaluar una propiedad indizada, la propiedad debe ser calificado y los argumentos debe ser suministrada de manera explícita por parte del usuario.

alt text

Lo que puede causar esto ...?

Respuesta

30

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

Si no se lanzara esa excepción, tendría un valor de -2145629296 para su Volume, que probablemente no se desee.

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

+0

Estaba creando la suma de los primeros 10,000 números naturales cuando encontré este error. Estaba usando el tipo de datos Int32 para la variable de suma. Cuando lo cambié a Int64, el problema se resolvió. Gracias. ¡Eso ayudo! – RBT

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

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

1

Valor máximo fo int es 2147483647, por lo 2055786000 + 93552000> 2147483647 y causó desbordamiento

2

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

Try usando Int64

0

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

0

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

3

Por simplicidad voy a utilizar bytes:

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

si A, B, y C fueron 'int', que se puede esperar 258, pero en el caso de 'bytes', el resultado esperado sería 2 (258 & 0xFF), pero en una aplicación de Windows se obtiene una excepción, en una consola que no se puede (no, pero esto puede depender de IDE, uso SharpDevelop).

A veces, sin embargo, se desea ese comportamiento (por ejemplo, solo se preocupan por los 8 bits inferiores del resultado).

que podría hacer lo siguiente:

byte a=250; 
byte b=8; 

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

De esta manera, tanto 'a' y 'b' se convierten en 'int', agregó, a continuación, fundido de nuevo a 'bytes'.

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

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

O si realmente quiere que el comportamiento, la forma más simple 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 'no seleccionada'.

O bien, si desea forzar la comprobación del desbordamiento, utilice 'marcado' en su lugar.

Espero que esto aclare las cosas.

Nurchi

P.S.

Confía en mí, esa excepción es su amigo :)

0

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

Para el que ha downvoted 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, a un valor que no cabe en un Int32 (o incluso Int64). Así que el error que recibirá será el mismo (la operación aritmética resultó en un desbordamiento) pero la razón es ligeramente diferente.

+0

por favor especifique por qué esta respuesta recibió un voto negativo –

+0

De hecho, he votado positivamente ya que esta es una buena información, pero asumo que el voto abajo es porque el título dice "Agregar números enteros", y no está agregando números enteros. – DCShannon

+0

gracias, y por supuesto tiene razón, no había notado esa parte –

Cuestiones relacionadas