Co to jest przepełnienie liczb całkowitych?
Przepełnienie liczb całkowitych odnosi się do zjawiska występującego w niektórych typach danych komputerowych, w których ich znaki zmieniają się z dodatnich na ujemne lub odwrotnie, gdy osiągną koniec odpowiednich zakresów. W zakresach komputerowych typy danych liczb całkowitych mają zakresy kołowe, a kiedy osiągną jeden koniec zakresu, natychmiast przenoszą się na drugi koniec zakresu. Nazywa się to również przepełnieniem liczb całkowitych.
Podpisana liczba całkowita może zawierać zakres wartości od -2 31 do (2 31 ) - 1. Ta liczba całkowita nie może mieć wartości (-2 31 ) - 1; raczej następna liczba, którą zwiększa, znajduje się na drugim końcu zakresu: (2 31–1 ). Zmiana z ujemnej na dodatnią na końcu zakresu jest przykładem przepełnienia liczb całkowitych. Z tego samego powodu liczba całkowita nie może mieć wartości 2 31 ; ta wartość zamiast tego przeszedłaby na drugi koniec zakresu i stałaby się -2 31 .
To przepełnienie ma znaczące konsekwencje podczas programowania. Tablica może zawierać tylko tyle indeksów, na ile pozwala liczba całkowita, a indeksy ujemne się nie liczą. Jeśli programista spróbuje utworzyć tablicę większą niż dopuszczalna liczba całkowita, mogą wystąpić znaczące błędy pamięci, ponieważ przepełnienie liczb całkowitych spowodowałoby ujemny indeks. Jest to szczególnie niebezpieczne w językach, które nie mają wyraźnych granic sprawdzania tablic, takich jak C ++.
Gdy występuje przepełnienie liczb całkowitych, mogą wystąpić powiązane typy przepełnienia, takie jak przepełnienie bufora, przepełnienie sterty i przepełnienie buforu stosu. We wszystkich tych przypadkach przepełnienie liczb całkowitych powoduje obłożenie struktur pamięci większą ilością danych, niż te struktury są w stanie zatrzymać. Te przepełnienia w prostych programach często nie robią więcej niż powodują nieprawidłowy odczyt lub błąd 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 jest poważnym problemem. Granice typu liczby całkowitej są wystarczająco duże, aby problem przepełnienia nie pojawił się, chyba że jednocześnie przetwarzanych jest wiele danych. W niektórych przypadkach przepełnienie można ograniczyć, tak jak w przypadku liczników inkrementujących, poprzez zastosowanie większego typu danych o większym zakresie. Większy typ danych może teoretycznie napotkać ten sam problem przepełnienia, ale ponieważ zakresy typów danych stają się większe, szanse na to stają się mniejsze. Zakres każdego typu liczb całkowitych jest co najmniej dwa razy większy niż następnego najmniejszego, więc jest wystarczająco dużo miejsca na dodatkowe dane.