Co to jest przepełnienie liczby całkowitej?

Przepełnienie liczby całkowitej odnosi się do zjawiska, które występuje w niektórych typach danych komputerowych, w których ich znaki zmieniają się z dodatnich na ujemne lub odwrotnie, gdy osiągną granice odpowiednich zakresów. W zakresach komputerowych typy danych całkowitych mają zakresy kołowe, a kiedy osiągną jeden koniec swojego zakresu, natychmiast przechodzą na drugi koniec swojego zakresu. Nazywa się to również przepełnieniem liczby całkowitej.

Liczba całkowita ze znakiem może zawierać zakres wartości od -231 do (231) – 1. Ta liczba całkowita nie może mieć wartości (-231) – 1; raczej następna liczba, do której się zwiększa, znajduje się na drugim końcu zakresu: (231 – 1). Zmiana z ujemnej na dodatnią na końcu jego zakresu jest przykładem przepełnienia liczby całkowitej. Z tego samego powodu liczba całkowita nie może mieć wartości 231; ta wartość zamiast tego przełączyłaby się na drugi koniec swojego zakresu i stałaby się -231.

To przepełnienie ma istotne konsekwencje podczas programowania. Tablica może zawierać tylko tyle indeksów, na ile pozwala typ całkowity, a indeksy ujemne się nie liczą. Jeśli programista spróbuje utworzyć tablicę większą niż pozwala na to typ liczby całkowitej, mogą wystąpić znaczące błędy pamięci, ponieważ przepełnienie liczby całkowitej spowoduje ujemny indeks. Jest to szczególnie niebezpieczne w językach, które nie mają wyraźnych granic sprawdzania tablic, takich jak C++.

Gdy wystąpi przepełnienie liczby całkowitej, mogą wystąpić powiązane typy przepełnienia, takie jak przepełnienie buforu, przepełnienie sterty i przepełnienie bufora stosu. We wszystkich tych przypadkach przepełnienie liczb całkowitych powoduje przytłoczenie struktur pamięci większą ilością danych, niż te struktury mogą pomieścić. Te przepełnienia w prostych programach często nie robią wiele więcej niż powodują błąd nieprawidłowego odczytu lub nieprawidłowego zapisu. Manipulowanie tym problemem przez hakerów może jednak powodować błędy pamięci, które mogą powodować poważniejsze problemy.

W większości prostych programów przepełnienie liczb całkowitych nie stanowi większego problemu. Limity typu integer są wystarczająco duże, aby problem przepełnienia nie wchodził w grę, chyba że obsłużono wiele danych jednocześnie. W niektórych przypadkach przepełnienie można złagodzić, tak jak w przypadku liczników narastających, używając większego typu danych o większym zakresie. Większy typ danych może teoretycznie napotkać ten sam problem z przepełnieniem, ale wraz ze wzrostem zakresów typów danych szanse na to maleją. Zakres każdego typu danych całkowitych jest co najmniej dwa razy większy od następnego najmniejszego, więc jest wystarczająco dużo miejsca na dodatkowe dane.