Переповнення цілих чисел

Переповнення цілих чисел

В и уже знаєте, що при додаванні цілих може відбуватися переповнення. Заковика в тому, що комп'ютер не видає попередження при переповненні: програма продовжить працювати з невірними даними. Більш того, поведінка при переповненні визначено тільки для цілих без знака.

Переповнення може привести до серйозних проблем: обнулення і втрати даних, можливим експлойтів, важковловимий помилок, які будуть накопичуватися з плином часу.
Розглянемо кілька прийомів відстеження переповнення цілих зі знаком і переповнення цілих без знака.

1. Попередня перевірка даних. Ми знаємо, з файлу limits.h, максимальне і мінімальне значення для чисел типу int. Якщо обидва числа позитивні, то їх сума не перевищить INT_MAX, якщо різниця INT_MAX і одного з чисел менше другого числа. Якщо обидва числа негативні, то різниця INT_MIN і одного з чисел повинна бути більше іншого. Якщо ж обидва числа мають різні знаки, то однозначно їх сума не перевищить INT_MAX або INT_MIN.

У цій функції змінної overflow буде присвоєно значення 1, якщо було переповнення. Функція повертає суму, незалежно від результату складання.

2. Другий спосіб перевірки - взяти для суми тип, максимальне (і мінімальне) значення якого явно більша за суму двох цілих. Після складання необхідно перевірити, щоб сума була не більша. ніж INT_MAX і не менше INT_MIN.

Зверніть увагу на явне приведення типів. Без нього спочатку відбудеться переповнення, і неправильне число буде записано в змінну c.

3. Третій спосіб перевірки платформозавісімий, більш того, його реалізація буде різною для різних компіляторів. При переповненні цілих (зазвичай) піднімається прапор переповнення в регістрі прапорів. Можна на асемблері перевірити значення прапора відразу ж після виконання підсумовування.

Тут змінна noOverflow дорівнює 1, якщо немає переповнення. jno (jump if no overflow) виконує перехід до мітці NO_OVERFLOW, якщо переповнення не було. Якщо ж переповнення було, то виконується

Робота з числами без знака набагато простіше: при переповненні відбувається обнуління і відомо, що вийшло число свідомо буде менше кожного з доданків.

Ось повний код, з перевірками.

ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 [email protected] Stepan Sypachev students