2012-04-15 5 views
12

Questa sembra una domanda stupida, ma non riesco a vedere la risposta. Ho un UInt64, che dovrebbe avere un valore massimo diUInt64 e "L'operazione trabocca al momento della compilazione in modalità selezionata"

UInt64.MaxValue 18446744073709551615 

Tuttavia, quando si tenta di assegnare un numero di dimensioni modeste, ottengo questo errore di overflow di "L'operazione trabocca al momento della compilazione in modalità controllata ". Se mi avvolgo in un blocco di "incontrollato" allora compila, e funziona come se questa variabile è pari a zero:

UInt64 value1 = 1073741824 * 8; // Compile error 
UInt64 value2 = 8589934592;  // Actual value - no error 

Perché è questo happenning ??

+0

Ah sì, questo lo spiegherebbe assolutamente! Grazie ragazzi! –

risposta

23

Perché:

UInt64 value1 = 1073741824 * 8; 

sta facendo l'aritmetica come un intero a 32 bit con segno, poi convertendolo in un ulong. Prova:

UInt64 value1 = 1073741824UL * 8; 

Il UL significa che il letterale è di un unsigned long. Vedere la sezione 2.4.4 del C# Specifica per ulteriori suffissi letterali:

Se il letterale è seguito dal suffisso UL, Ul, uL, ul, LU, Lu, Lu, o lu, è di tipo ulong

4

1073741824 è un int, non uno UInt64.
Pertanto, la moltiplicazione supera il limite di un numero intero con segno a 32 bit.

Aggiungere il suffisso ul (senza firma lungo) a entrambi gli operandi.

1

Hai un errore perché si opera con int invece di long 1073741824 è ancora int (max per int è 2147483647).
Quindi nel primo caso si verifica un overflow del tipo int.
Cambia prima espressione con:

UInt64 value1 = 1073741824L * 8; 

ed il problema sparirà.

+0

non ha notato che si opera con valore senza segno. Per unsigned long devi usare 1073741824UL invece di 1073741824L. –

Problemi correlati