Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Masz licznik, który może liczyć tylko do pewnej liczby. Na przykład, kieszonkowy kalkulator, który pokazuje maksymalnie 999. Jeśli spróbujesz dodać 1 do 999, nie będzie w stanie pokazać 1000 - cyfry po prostu "przepełnią się" (overflow) i kalkulator pokaże coś zupełnie innego, na przykład 000.
W programowaniu taki efekt nazywa się integer overflow (przepełnienie liczby całkowitej).
Dzieje się tak, gdy liczba staje się większa od maksymalnej wartości, którą może przechować wybrany typ zmiennej.
Na przykład, jeśli zmienna int może przechowywać liczby do 2,147,483,647, to dodanie 1 sprawi, że jej wartość… stanie się negatywna!
Dlaczego 2,147,483,647 to "sufit" dla 32-bitowej liczby
W komputerze liczby przechowywane są w postaci binarnej (czyli jako sekwencja zer i jedynek).
"32-bitowy" oznacza, że do przechowywania liczby przydzielono 32 komórki, a w każdej może być albo 0, albo 1.
Jednak jeśli liczba jest signed (ze znakiem), to jedna z tych komórek jest zarezerwowana dla znaku:
- 0 w pierwszym bicie — liczba dodatnia,
- 1 w pierwszym bicie — liczba ujemna.
To znaczy, że zamiast 32 bitów dla wartości liczby pozostaje tylko 31 bit.
Maksymalna wartość Gdy wszystkie 31 bitów (oprócz znaku) jest wypełnionych jedynkami, otrzymujemy największą możliwą dodatnią liczbę:
1111111111111111111111111111111 (31 jedynka)
W systemie dziesiętnym to dokładnie 2,147,483,647. W formie szesnastkowej (hex) zapisuje się to jako 0x7FFFFFFF:
- 7 — to binarnie 0111 (czyli znak 0 + trzy jedynki),
- F — to binarnie 1111 (cztery jedynki),
- i tak dalej do końca.
Dlatego w programach czasami występują bardzo dziwne błędy, a w historii zdarzały się nawet poważne awarie z powodu przepełnienia. Zdarzają się nawet memy z powodu błędu integer overflow, ale to nie jest pewne.
Ten post nie ma jeszcze żadnych dodatków od autora.