Il problema è che il letterale "99" viene trattato come un int. Se aggiungi "L" lo tratterà come un lungo. Per risolvere il problema la compilazione:
long test2 = 99L * 99L * 99L * 99L * 99L;
E per risolvere il "risultato non corretto" causato dalla integer overflow:
long r = 99;
long test1 = r * r * r * r * r;
Il punto chiave è che l'espressione a destra del "=" viene valutata prima del l'assegnazione a long r
è terminata.
Ci sono altri suffissi letterali potreste essere interessati a:
Type Suffix Example
uint U or u 100U
long L or l 100L
ulong UL or ul 100UL
float F or f 123.45F
decimal M or m 123.45M
@ m.edmonson, per quanto riguarda la tua domanda sul perché si esce a 919965907. Che succede, è che il valore è "wrapping" in giro int.MaxValue. Potete vedere questo con un piccolo programma di test:
int i = 99; // 99
i *= 99; // 9801
i *= 99; // 970299
i *= 99; // 96059601
i *= 99; // 919965907 should be 9509900499 but comes out to 919965907
// which is (9509900499 % int.MaxValue)
long k = 9509900499 % int.MaxValue;
Cosa si intende per "involucro"? Se si supera int.MaxValue
per 1, il valore "torna" a int.MinValue
.
int j = int.MaxValue;
j++;
bool isNowMinValue = (j == int.MinValue); // true, the value has "wrapped around"
Questo è un po 'semplicistico; se cerchi "overflow intero" otterrai una spiegazione migliore. Vale la pena di comprendere come numeri interi (e altri tipi numerici) sono rappresentati con 32 bit:
http://en.wikipedia.org/wiki/Signed_number_representations
Risposta eccellente - puoi spiegare perché lui ottiene un risultato diverso tra la moltiplicazione lunga e quella intera? –
Puoi chiarire cosa intendi avvolgendo? E cosa c'entra con il modulo%? –
Credo che tu abbia bisogno solo di un '99L', il resto sarà trasmesso. –