Problemem jest to, że ciąg znaków „99” jest traktowany jako int. Jeśli dodasz "L", potraktuje to jako długi. Aby rozwiązać problem kompilacji:
long test2 = 99L * 99L * 99L * 99L * 99L;
I naprawić „nieprawidłowy wynik” spowodowanych przez całkowitą przepełnienie:
long r = 99;
long test1 = r * r * r * r * r;
Kluczową kwestią jest to, że wyrażenie po prawej stronie „=” jest oceniany przed zadanie zostało wykonane na .
Istnieją inne dosłowne przyrostków może być zainteresowany w:
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, chodzi o Twoje pytanie, dlaczego to wychodzi do 919965907. co się dzieje, jest to, że wartość jest „opakowanie” wokół int.MaxValue. Możesz to zobaczyć za pomocą małego programu testowego:
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;
Co to znaczy "owinąć"? Kiedy przekroczysz int.MaxValue
o 1, wartość "powraca" do int.MinValue
.
int j = int.MaxValue;
j++;
bool isNowMinValue = (j == int.MinValue); // true, the value has "wrapped around"
To trochę uproszczone; jeśli szukasz "przepełnienia liczby całkowitej", otrzymasz lepsze wyjaśnienie. Warto zrozumieć, jak całkowite (oraz inne typy liczbowe) są reprezentowane w 32 bitach:
http://en.wikipedia.org/wiki/Signed_number_representations
Doskonała odpowiedź - czy możesz wyjaśnić, dlaczego dostaje inny wynik między mnożeniem długim a całkowitym? –
Czy możesz wyjaśnić, co masz na myśli, pakując? A co to ma wspólnego z modułem%? –
Wierzę, że potrzebujesz tylko jednego '99L', reszta zostanie wyrzucona. –