Nadmiar

Z Wikipedii, wolnej encyklopedii
(Przekierowano z Przepełnienie)
Skocz do: nawigacja, szukaj

Nadmiar, nadmiar arytmetyczny (ang. overflow, arithmetic overflow) − sytuacja, w której wartość wyniku operacji arytmetycznej przekracza wielkość rejestru lub pamięci[1].

W większości komputerów rozróżniane są dwa warunki nadmiaru:

  • przeniesienie występujące podczas dodawania lub odejmowania, biorąc pod uwagę operandy i wyniki jako liczby bez znaku, nie może zostać w ostatecznym rozwiązaniu,
  • wynik ma znak inny niż możliwy do przewidzenia podczas operacji arytmetycznych, np. wynikiem dodawania dwóch liczb dodatnich jest liczba ujemna.

Podczas operacji wykorzystujących przeniesienie, dobrą praktyką jest sprawdzenie flagi przeniesienia (ang. carry flag) po zakończeniu dodawania lub odejmowania liczb całkowitych bez znaku, a w sytuacji, w której znak wyniku danej operacji arytmetycznej jest inny niż przewidywany − sprawdzenie flagi przepełnienia (ang. overflow flag).

Sposoby obsługi nadmiaru[edytuj]

Istnieje kilka sposobów obsługi nadmiaru:

  1. Właściwy dobór typów liczb pod względem rozmiaru/długości i zapisu znaku podczas projektowania programu.
  2. Rozważny dobór kolejności wykonywania działań i wstępne sprawdzenie operandów, co uniemożliwia uzyskanie wyniku większego niż możliwy do przechowania.
  3. Przewidywanie sytuacji, w których może nastąpić nadmiar i zapobieganie nadmiarowi przez dodanie do liczb dodatkowych bitów oraz interpretowanie części bitów jako bitów statusu.
  4. Przypisywanie wartości wskazujących na nadmiar oraz zwrócenie flagi wartości.
  5. Ignorowanie nadmiaru.

Dzielenie przez zero nie jest traktowane jako nadmiar arytmetyczny. W zbiorze liczb rzeczywistych dzielenie przez zero jest niezdefiniowane, a dla dzielenia zdefiniowane wyniki to: plus nieskończoność albo minus nieskończoność w zależności od znaku, lub brak wyniku.

Przykłady nadmiaru[edytuj]

Najczęściej używany typ całkowity w procesorach 32-bitowych pozwala zapisać wartości od (binarnie 10000000 00000000 00000000 00000000) do (binarnie 01111111 11111111 11111111 11111111) i jest używany np. przez zmienną przechowującą liczbę sekund, które upłynęły od 1 stycznia 1970 00:00:00 UTC. Nadmiar jest w tym przypadku przyczyną problemu roku 2038.

Zobacz też[edytuj]

Przypisy

Bibliografia[edytuj]