Избыточный займ и переполнениеЯ пока не нашел подходящего места в самоучителе для этого вопроса, но считаю, что уже необходимо осветить этот вопрос. Что понимается под избыточным займом? Представим себе переменную tmp в которой сидит число 2. А теперь представим что из tmp вычитается число 3.
tmp = 2;
tmp = tmp – 3;
Сколько сейчас в tmp ? Во-первых, необходимо определиться с тем, к какому типу данных относится tmp. Пусть это будет unsigned char (беззнаковый чар), т.е. его диапазон 0…255.
Во-вторых, для лучшего понимания от tmp будем отнимать в два захода, сначала отнимем 2, а потом 1.
Отняли 2. В tmp у нас 0.
Отнимаем еще 1. И значение tmp у нас становится 255. Произошел так называемый избыточный займ.
Необходимо понимать, что нет ограничений по поводу вычитания в беззнаковом чаре. Впрочем и в других переменных тоже. В знаковом чаре седьмой бит – это признак отрицательного числа. Но всё равно, если будет вычтено больше, чем есть в переменной, у данной переменной будет сделан избыточный займ. Т.е. число не станет более отрицательным, и оно не будет равно нулю.
Таким образом, механизм избыточного займа выглядит как вычитание из переменной до нуля, а затем вычитание остатка из максимума этой переменной (перечитайте абзац еще раз).
Переполнение выглядит точно также, но наоборот.
unsigned char tmp = 255;
tmp = tmp + 1;
Теперь в tmp у нас ноль.
|