Nadmiar

Z Wikipedii, wolnej encyklopedii

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 | edytuj kod]

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 liczb całkowitych, w przeciwieństwie do nadmiaru, jest zwykle zgłaszane przez procesor jako wyjątek. Dla liczb zmiennoprzecinkowych dzielenie przez zero liczby niezerowej da w wyniku tak jak w przypadku nadmiaru, a dla wynikiem będzie NaN.

Przykłady nadmiaru[edytuj | edytuj kod]

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 | edytuj kod]

Przypisy[edytuj | edytuj kod]

Bibliografia[edytuj | edytuj kod]