web-dev-qa-db-fra.com

Opération arithmétique a donné lieu à un trop-plein. (Ajouter des entiers)

Je ne peux pas comprendre cette erreur: 

Dans cet appel à la méthode SetVolume, Volume = 2055786000 et size = 93552000. Le volume est une propriété Integer et la taille est également Integer, comme vous pouvez le voir. 

La classe est une classe partielle d'une classe d'entité dbml. Cependant, cette propriété Volume N'EST PAS une colonne de la base de données. Elle n'existe que dans la classe partielle, en tant que "propriété d'objet métier". 

Voir le détail montre: 

Data> Item : Pour évaluer une propriété indexée, celle-ci doit être qualifiée et les arguments doivent être explicitement fournis par l'utilisateur.

alt text

Qu'est-ce qui peut causer ça ...?

22
bretddog

La valeur maximale d'un entier (qui est signé) est 2147483647. Si cette valeur est dépassée, une exception est générée pour empêcher un comportement inattendu de votre programme. 

Si cette exception ne devait pas être levée, vous auriez une valeur de -2145629296 pour votre Volume, qui n'est probablement pas souhaitée. 

Solution: Utilisez un Int64 pour votre volume. Avec une valeur maximale de 9223372036854775807, vous êtes probablement plus sûr.

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

Donc, vous ne pouvez pas stocker ce nombre dans un entier. Vous pouvez utiliser Int64 type qui a une valeur maximale de 9,223,372,036,854,775,807.

7
Darin Dimitrov

Pour simplifier, j'utiliserai des octets:

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

si a, b et c étaient 'int', vous vous attendriez à 258, mais dans le cas de 'octet', le résultat attendu serait 2 (258 & 0xFF), mais dans une application Windows, vous obtenez une exception, dans un console un que vous ne pouvez pas (pas moi, mais cela dépend de IDE, j'utilise SharpDevelop).

Parfois, cependant, ce comportement est souhaité (par exemple, vous ne vous souciez que des 8 bits inférieurs du résultat).

Vous pouvez faire ce qui suit:

byte a=250;
byte b=8;

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

De cette façon, les deux mots "a" et "b" sont convertis en "int", ajoutés puis rediffusés en "octets".

Pour plus de sécurité, vous pouvez aussi essayer:

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

Ou si vous voulez vraiment ce comportement, la façon la plus simple de procéder est la suivante:

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

Ou déclarez d’abord vos variables, puis faites le calcul dans la section «non vérifiée».

Sinon, si vous souhaitez forcer la vérification du débordement, utilisez plutôt «coché».

Espérons que cela arrange les choses.

Nurchi

P.S.

Croyez-moi, cette exception est votre amie :)

3
nurchi

La valeur entière résultante est en dehors de la plage qu'un type de données entier peut contenir.

Essayez d'utiliser Int64

2
Waqas Raja

La valeur maximale fo int est 2147483647, donc 2055786000 + 93552000> 2147483647 et cela a provoqué un dépassement

1
x2.

Cette erreur s’est produite lorsqu’une valeur renvoyée avait pour valeur -1. # IND en raison d’une division par zéro . Plus d'informations sur les exceptions à virgule flottante IEEE en C++ ici sur SO et par John Cook

Pour celui qui a voté contre cette réponse (et n'a pas précisé pourquoi), la raison pour laquelle cette réponse peut être importante pour certains est qu'une division par zéro conduira à un nombre infiniment grand et donc à une valeur qui ne rentre pas dans une Int32 (ou même Int64) . Ainsi, l'erreur que vous recevrez sera la même (l'opération arithmétique a entraîné un débordement), mais la raison est légèrement différente.

0
Daniël Tulp

2055786000 + 93552000 = 2149338000, ce qui est supérieur à 2 ^ 31. Ainsi, si vous utilisez des entiers signés codés sur 4 octets, le résultat de l'opération ne correspond pas et vous obtenez une exception de dépassement de capacité.

0
Jules Olléon

La taille maximale d'un int est 2147483647. Vous pouvez utiliser un Int64/Long qui est beaucoup plus grand.

0
Darren Young