2011-01-21 12 views
18

non riesco a capire questo errore:L'operazione aritmetica ha provocato un overflow. (interi Aggiunta)

In questa chiamata al metodo setVolume, Volume = 2.055.786 mila e dimensioni = 93552000. volume è una proprietà integer e la dimensione è anche intero, come Puoi vedere.

La classe è una classe parziale di una classe di entità dbml, tuttavia questa proprietà del volume NON è una colonna nel database, esiste solo nella classe parziale, come una "proprietà dell'oggetto business".

Visualizzazione dettaglio spettacoli:

dati> Articolo: Al fine di valutare una proprietà indicizzata, la proprietà deve essere qualificato e gli argomenti deve essere esplicitamente fornito dall'utente.

alt text

Che cosa può causare questo ...?

risposta

30

Il valore massimo di un numero intero (sottoscritta) è 2147483647. Se il valore viene superato, viene generata un'eccezione per impedire il comportamento imprevisto del programma.

Se quell'eccezione non verrebbe generata, avresti un valore di -2145629296 per il tuo Volume, che probabilmente non è voluto.

Soluzione: utilizzare un Int64 per il volume. Con un valore massimo di 9223372036854775807, probabilmente sei più al sicuro.

+0

Stavo creando la somma dei primi 10.000 numeri naturali quando ho riscontrato questo errore. Stavo usando il tipo di dati Int32 per la variabile di sommatoria. Quando l'ho cambiato in Int64, il problema è stato risolto. Grazie. Ha aiutato! – RBT

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

Quindi non è possibile memorizzare questo numero in un numero intero. È possibile utilizzare il tipo Int64 che ha un valore massimo di 9,223,372,036,854,775,807.

1

valore massimo fo int è 2147483647, così 2.055.786 mila + 93.552.000> 2147483647 e ha causato un sovraccarico

2

Il valore intero del risultato non è compreso nell'intervallo consentito da un tipo di dati intero.

prova utilizzando Int64

0

2055786000 + 93552000 = 2149338000, che è maggiore di 2^31. Pertanto, se si utilizzano numeri interi con segno codificati su 4 byte, il risultato dell'operazione non si adatta e si ottiene un'eccezione di overflow.

0

La dimensione massima per un valore int è 2147483647. È possibile utilizzare un Int64/Long che è molto più grande.

3

Per semplicità userò byte:

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

se A, B, e C sono stati 'int', ci si aspetterebbe 258, ma nel caso di 'byte', il risultato atteso sarebbe 2 (258 & 0xFF), ma in un'applicazione Windows si ottiene un'eccezione, in una console non è possibile (io no, ma questo può dipendere da IDE, io utilizzo SharpDevelop).

volte, tuttavia, che il comportamento è desiderato (ad esempio vi interessa soltanto gli 8 bit inferiori del risultato).

Si potrebbe fare la seguente:

byte a=250; 
byte b=8; 

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

In questo modo sia 'a' e 'b' vengono convertiti in 'int', ha aggiunto, poi fusa di nuovo a 'byte'.

Per essere sul sicuro, si potrebbe anche voler provare:

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

Oppure, se si vuole veramente che il comportamento, il modo più semplice di fare quanto sopra è:

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

Oppure dichiarare prima le variabili, poi fare i calcoli nella sezione 'deselezionata'.

In alternativa, se si desidera forzare la verifica dell'overflow, utilizzare invece 'checked'.

Spero che questo chiarisca le cose.

Nurchi

P.S.

Fidati di me, tale eccezione è il vostro amico :)

0

Questo errore si è verificato per me quando un valore è stato restituito come -1. # IND a causa di una divisione per zero. Maggiori informazioni su IEEE eccezioni in virgola mobile in C++ here on SO e by John Cook

Per colui che ha downvoted questa risposta (e non ha specificato il motivo), il motivo per cui questa risposta può essere significativo per alcuni è che una divisione per zero condurrà a un numero infinitamente grande e quindi a un valore che non si adatta a un Int32 (o anche a Int64). Quindi l'errore che si riceve sarà lo stesso (l'operazione aritmetica ha comportato un overflow) ma la ragione è leggermente diversa.

+0

per favore specificare perché questa risposta ha un downvote –

+0

Ho effettivamente upvoted dato che questa è una buona informazione, ma presumo che il downvote sia perché il titolo dice "Aggiunta di numeri interi" e non si aggiungono numeri interi. – DCShannon

+0

grazie, e ovviamente hai ragione, non avevo notato quella parte –