Wprowadzenie
Problem polega na przepełnieniu liczb całkowitych. Jeśli się przepełni, wraca do wartości minimalnej i kontynuuje od tego momentu. Jeśli spada, wraca do wartości maksymalnej i kontynuuje od tego momentu. Poniższy obraz przedstawia licznik kilometrów. Używam tego, aby wyjaśnić przepełnienia. To mechaniczny przelew, ale wciąż dobry przykład.
W liczniku kilometrów, max digit = 9
więc wykracza poza maksymalne średnie 9 + 1
, które przenosi i daje 0
; Jednak nie ma wyższej cyfry do zmiany na a 1
, więc licznik resetuje się do zero
. Masz pomysł - teraz przychodzą mi na myśl „przepełnienia całkowitoliczbowe”.
Największy dosłownym dziesiętny typu int to 2147483647 (2 31 1). Wszystkie literały dziesiętne od 0 do 2147483647 mogą pojawić się wszędzie tam, gdzie może pojawić się literał int, ale literał 2147483648 może pojawić się tylko jako operand jednoargumentowego operatora negacji -.
Jeśli dodawanie liczb całkowitych przepełnia, wynikiem są najmniejsze bity sumy matematycznej, reprezentowane w jakimś wystarczająco dużym formacie uzupełnienia do dwóch. Jeśli wystąpi przepełnienie, znak wyniku nie jest taki sam, jak znak sumy matematycznej dwóch wartości operandów.
W ten sposób 2147483647 + 1
przepełnia się i zawija do -2147483648
. Stąd int i=2147483647 + 1
byłby przepełniony, co nie jest równe 2147483648
. Mówisz też „zawsze wypisuje 0”. Nie, ponieważ http://ideone.com/WHrQIW . Poniżej te 8 liczb pokazuje punkt, w którym obraca się i przepełnia. Następnie zaczyna drukować zera. Nie zdziw się też, jak szybko to oblicza, dzisiejsze maszyny są szybkie.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Dlaczego przepełnienie liczb całkowitych „zawija się”
Oryginalny plik PDF