Domanda

Non riesco a capire questo errore:

In questo chiamata al metodo di setVolume, Volume = 2055786000 e dimensione = 93552000. Il volume è una proprietà Integer, e la dimensione è anche Integer, come si può vedere.

La classe è una classe parziale di una classe di entità dbml, tuttavia questa proprietà volume non è una colonna nel database, esistono solo nella classe parziale, come "proprietà oggetto di business".

Visualizzazione dettaglio mostra:

Dati> Oggetto :. 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 ...?

È stato utile?

Soluzione

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

Se tale eccezione non sarebbe stato gettato, si avrebbe avuto un valore di -2145629296 per il vostro Volume, che è molto probabilmente non voleva.

Soluzione: Utilizzare un Int64 per il volume. Con un valore massimo di 9223372036854775807, si è probabilmente più sul sicuro.

Altri suggerimenti

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

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

Per semplicità utilizzerò byte:

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

se a, b, ec erano '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 un una console che non può (non lo faccio, ma questo può dipendere da IDE, io uso SharpDevelop).

A volte, tuttavia, è desiderato che il comportamento (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 colato di nuovo a 'byte'.

Per essere sul sicuro, si potrebbe anche voler provare:

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

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;
}

o dichiarare le variabili, poi fare la matematica nella sezione 'incontrollata'.

In alternativa, se si vuole forzare il controllo di troppo pieno, utilizzo 'controllato', invece.

Spero che questo cancella le cose.

Nurchi

P.S.

Fidati di me, tale eccezione è tuo amico:)

Il valore intero risultato è fuori del range che un tipo di dati integer può contenere.

Provare a utilizzare Int64

Il valore massimo fo int è 2147483647, in modo da 2.055.786 mila + 93.552.000> 2147483647 e ha causato un sovraccarico

2055786000 + 93552000 = 2149338000, che è maggiore di 2 ^ 31. Quindi, se si sta utilizzando numeri interi firmati codificati su 4 byte, il risultato dell'operazione non va bene e si ottiene un'eccezione di overflow.

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

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 ++ qui SO e da John Cook

Per chi 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 porterà ad un numero infinitamente grande e quindi un valore che non è così inserirsi in un Int32 (o anche Int64). Quindi l'errore si riceve sarà lo stesso (operazione aritmetica ha comportato un overflow), ma il motivo è leggermente diversa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top