4.1.2. Переполнение разрядной сетки
При сложении чисел одинакового знака, представленных в форме с фиксированной запятой, может возникнуть переполнение разрядной сетки.
1. Признаком переполнения разрядной сетки при сложении чисел в прямом коде является появление единицы переноса из старшего разряда цифровой части числа.
2. Признак переполнения разрядной сетки при сложении чисел в дополнительном и обратном коде — получение знака результата, про-тивоположного знакам операндов.
1) 0. 1100 1. 0101
2) 0. 0111 1. 1001
При умножении любых чисел также может возникнуть переполнение разрядной сетки.
Для обнаружения переполнения разрядной сетки в составе цифрового автомата должны быть предусмотрены аппаратные средства, автоматически вырабатывающие признак переполнения — некий сигнал переполнения.
Один из методов обнаружения переполнения разрядной сетки предполагает ввод вспомогательного разряда в знаковую часть изображения числа, который называют разрядом переполнения. Такое представление числа называют модифицированным.
4.1.3. Модифицированный прямой, обратный и дополнительный код
Эти коды отличаются от обычных прямых, обратных и дополнительных тем, что имеют по два знаковых разряда. При выполнении арифметических действий над двоичными числами эти два знака позволяют легко определить переполнение разрядной сетки. Если содержимое этих двух разрядов совпадает, то значит переполнение отсутствует. В противном случае в компьютере вырабатывается управляющий сигнал (сигнал переполнения) либо на останов компьютера, либо на устранение переполнения разрядной сетки.
1) Сложить два числа в модифицированном коде:
X= 00. 01012,Y= 00. 00112 ,X+Y= 510 + 310 = 810
2) Сложить X= -510 = -01012 = 11. 0101 ,Y= -810 = -10002 = 11. 1000
1 11. 0011 = -1310
3) Сложить X= 0,1101 ,Y= 0,1101,X+Y= 2610
01. 1010 различные знаковые разряды свидетельствуют о переполнении разрядной сетки.
В последнем примере получился отрицательный ноль, поэтому компьютер генерирует сигнал сбоя. Надо отметить, что в машинах 3-го и 4-го поколений модифицированный код не используется.
4.1.4. Алгебраическое сложение чисел, представленных в форме с плавающей запятой
Нужно подчеркнуть, что при выполнении любых арифметических действий над операндами, представленными в форме с плавающей запятой, операции, выполняемые над мантиссами и порядками (или характеристиками) этих чисел, различны. Поэтому перед началом любой арифметической процедуры каждый из операндов «расчленяется»: порядок (характеристика) отделяется от мантиссы операнда, что-бы можно было над ними выполнять необходимые отдельные процедуры. После выполнения конкретного арифметического действия и обязательной процедуры нормализации результата, его порядок или характеристика и мантисса «упаковываются» в обычный формат с плавающей запятой.
В случае алгебраического сложения порядки операндов обязательно должны быть одинаковыми. Поэтому в начале процедуры сложения и вычитания чисел производится, при необходимости, выравнивание характеристик операндов. Для этого мантисса операнда с меньшей характеристикой сдвигается по разрядной сетке вправо с прибавление единицы к его характеристике при каждом сдвиге на один разряд. Эта процедура продолжается до тех пор пока характеристики обоих операндов не станут равными.
Полученная таким образом характеристика, одинаковая для обоих операндов, присваивается, как предварительная, результату операции. Далее осуществляется сложение или вычитание мантисс по правилам, аналогичным для чисел с фиксированной запятой, в частности мантисса одного из операндов преобразуется в дополнительный код для того чтобы процедуру вычитания свести к сложению. Если ответ получился в дополнительном коде, то его преобразуют в прямой, т.к. мантисса числа с плавающей запятой — это всегда модуль числа. Далее, при необходимости, выполняется нормализацияи округление ответа. В процессе нормализации мантисса поразрядно сдвигается влево или вправо. При сдвиге влево на каждый разряд вычитается единица из характеристики, предварительно присвоенной ответу. При каждом сдвиге вправо — к ней прибавляется единица. Отметим, что сдвиг мантиссы вправо необходим в тех случаях, когда при сложении мантисс произошло переполнение разрядной сетки. В процессе этих последних операций определяются окончательные значения характеристики и мантиссы ответа.
Таким образом, операция нормализации числа состоит из проверки выполнения условия
и сдвига изображения мантиссы в ту или иную сторону с соответствующей коррекцией характеристики. Сдвиги могут осуществляться на один и более разрядов в левую сторону, или на один разряд в правую сторону в пределах разрядной сетки машины.
Нарушение нормализации может быть двух видов: нарушение справа, т.е. когда величина результата больше или равна 1, и слева, когда величина результата оказывается меньше 0,12.
Надо отметить, что при реализации алгоритмов математических операций в формате с плавающей запятой каждый раз, когда осуществляется та или иная процедура, затрагивающая характеристики операндов или результата, производится контроль над переполнением и исчезновением порядка, т.е. контролируется условие
0 r rmax ,
где rmax = l + pmax .
Имеем 8-разрядную мантиссу и 6-разрядный порядок, смещение равно 10002. Сложим 2 числа с мантиссами m1 = 0,10100000,m2 = 0,10000000 и с характеристикамиr1 = 001011,r2 = 001010. Т.к. порядки разные надо их выравнивать:r1 -r2 = 000001, значит надо сдвинутьm2 на 1 разряд вправо, а кr2 прибавить 1. После преобразований получим:
m2 = 0,01000000,r2 = 001010 + 000001 = 001011. Складываем мантиссы, получаем:m=m1 +m2 = 0,10100000 + 0,01000000 = 0,11100000,r= 001011.
Большая Энциклопедия Нефти и Газа
Переполнение разрядной сетки той части сумматора, которая отведена для оперирования мантиссами, не мешает получению искомой суммы или разности. Переполнение разрядной сетки в целом после сложения или вычитания может произойти только при увеличении порядка я2 на 1 и заключается в переполнении той части разрядной сетки, которая отведена под порядок. [2]
Переполнение разрядной сетки , результат неправильный. [3]
Переполнение разрядной сетки , результат вычитания неправильный. [4]
Переполнение разрядной сетки , результат неправильный. [5]
Переполнение разрядной сетки , результат вычитания неправильный. [6]
Переполнение разрядной сетки возможно при вычислении величин С, R, Cfc Rk или в некоторых других редких случаях. Заметим, однако, что масштабные множители dj могут выйти из допустимого диапазона чисел, если матрица оказывается приводимой. [7]
Переполнение разрядной сетки той части сумматора, которая отведена для оперирования мантиссами, не мешает получению искомой суммы или разности. Переполнение разрядной сетки в целом после сложения или вычитания может произойти только при увеличении порядка щ на 1 и заключается в переполнении той части разрядной сетки, которая отведена под порядок. [8]
Переполнение разрядной сетки той части сумматора, которая отведена для оперирования мантиссами, не мешает получению искомой суммы или разности. Переполнение разрядной сетки в целом после сложения или вычитания может произойти только при увеличении порядка тг2 на 1 и заключается в переполнении той части разрядной сетки, которая — отведена под порядок. [9]
Переполнение разрядной сетки возможно в следующих случаях. [10]
Переполнение разрядной сетки в результате выполнения этих операторов исключается. [11]
Переполнение разрядной сетки для этих операций исключается. [13]
Переполнение разрядной сетки возможно в следующих случаях. [14]
Переполнение разрядной сетки в результате выполнения этих операторов исключается. [15]
Что такое переполнение разрядной сетки
Проверим, так ли это на самом деле. Сложим в программе два числа и проанализируем получившийся код отладчиком, обращая особое внимание на состояние флагов OF (переполнения) и CF (переноса) до и после выполнения команды. Например:
Налицо явное противоречие теории, изложенной в учебнике, и действительности, открывшейся после манипуляций с отладчиком. Что же, продолжим изучение теории. Что утверждают в своем учебнике "Язык Ассемблера и организация ЭВМ" В.Сорокин и В.Сарычев ?
". Флаг переноса CF устанавливается в единицу, если произошел перенос из самого старшего разряда числа при команде сложения или если требуется заем для самого старшего разряда уменьшаемого при вычитании."
". Флаг переполнения OF используется как индикатор переполнения при работе с числами со знаком. Он устанавливается в 1, если результат операции над числами со знаком выйдет за пределы допустимого диапазона результата и устанавливается в 0 в противном случае."
По порядку установки флага переноса авторы не сообщили нам ничего нового. Более интересна информация о флаге переполнения, где вскользь упоминается о его зависимости от наличия у числа знака; чтобы выяснить, отличаются ли данные сведения от тех, что были найдены в предыдущем учебнике, произведем краткий экскурс в теорию знаковых и беззнаковых чисел, и вспомним, чем они отличаются друг от друга.
На уровне машинных команд между этими двумя видами чисел нет никакой разницы. Находящийся в памяти или в одном из регистров операнд представляет собой (в зависимости от используемой модели адресации) 8-,16- или 32-разрядное число, все разряды которого абсолютно равноправны. Понятие знака введено исключительно для возможности манипулирования (на логическом уровне) с отрицательными числами — для процессора все числа одинаковы, а для программиста они отличаются тем, что для одних высший разряд выступает в качестве информации о знаке числа (знаковые числа), а для других все разряды несут информации о самом числе (беззнаковые числа). Естественно, выделение одного разряда под знак приводит к уменьшению возможной величины знакового числа вдвое 1 ; так, максимальное значение беззнакового 8-разрядного числа равно 11111111b, или 255, максимальное же (минимальное) значение аналогичного знакового числа равно соответственно 01111111b, или 127 (-128, или 10000000b). Если старший разряд знакового числа равен 1, число считается отрицательным, если 0 — положительным. Чтобы определить величину знакового числа, следует обратить в нем все биты (изменить их значения с 0 на 1 и наоборот), и приписать к полученному модулю (он считается беззнаковым) знак (-), если старший бит искомого числа был равен 1 2 . Исходя из этого, становится понятным различие на 1 в диапазонах для положительных и отрицательных величин (127,-128) — для последних может использоваться старший бит, который и дает единичную прибавку. Легко видеть, что больше 127 (меньше -128) знаковое число быть не может, поскольку для этих величин все информационные разряды уже взведены (сброшены), и дальнейшее увеличение (уменьшение) числа приведет к переносу в знаковый разряд (заему из него) и, соответственно, изменению знака числа.
. а это и есть пересказ иными словами того, что написано по поводу флага переполнения в учебнике "Язык Ассемблера и организация ЭВМ" . То есть и здесь авторы не сообщили нам ничего нового — речь идет все о том же пресловутом переносе в знаковый бит (старший разряд). А это, как мы уже убедились, не соответствует действительности.
Популярные учебники не могут помочь нам в выяснении того, когда при выполнении арифметических команд возникает перенос, а когда — переполнение. Остается выяснить это самостоятельно, складывая между собой различные числа во всевозможных комбинациях, и анализируя состояние флагов OF и CF. При этом каждая пара чисел будет интерпретироваться дважды — сперва как две знаковых, затем как две беззнаковых величины.
Итак, установка флажков переноса и переполнения производится по следующим правилам:
ПЕРЕНОС БЕЗ ПЕРЕПОЛНЕНИЯ ( CF=1 , OF=0 ) — тогда,когда производится перенос единицы в знаковый разряд ( 7,15,31-й ) и перенос единицы из разрядной сетки (из 7,15 или 31-го разрядов в 8,16,32 , несуществующие для регистра указанной размерности).
Сложение БЕЗЗНАКОВЫХ чисел при возникновении переноса протекает неправильно (ТОЛЬКО из-за переноса из разрядной сетки — перенос в знаковый разряд роли не играет). При интерпретации слагаемых как беззнаковых чисел перенос из разрядной сетки приводит к потере старших разрядов числа, и результат оказывается неверным.
Сложение ЗНАКОВЫХ чисел при возникновении переноса протекает правильно , так как при такой интерпретации слагаемые представляют собой ЛИБО пару "ПОЛОЖИТЕЛЬНОЕ ЧИСЛО + ОТРИЦАТЕЛЬНОЕ ЧИСЛО" (старший бит одного слагаемого равен 0, а второго — 1, и перенос из шестого (четырнадцатого, тридцатого) бита приводит к переносу в старший и переносу из разрядной сетки), и результат такого сложения не может быть неправильным — он будет находиться в пределах -128 — +127 ; ЛИБО пару "ДВА ОТРИЦАТЕЛЬНЫХ ЧИСЛА,СУММА КОТОРЫХ НЕ МЕНЬШЕ -128" (это означает, что сочетания единичных битов первого и второго слагаемых ОБЯЗАТЕЛЬНО приведут к переносу в старший разряд в то время,как будет произведен перенос из разрядной сетки, и знаковый бит не будет потерян; для этого и налагается условие на сумму — -127 — 1, -120 — 8, -64 — 64 , НО НЕ — -127 — 2, -64 — 65 ). В последних случаях возникает перенос с переполнением, так как производится только перенос из разрядной сетки.
ПЕРЕПОЛНЕНИЕ БЕЗ ПЕРЕНОСА ( OF=1 , CF=0 ) — тогда, когда производится ТОЛЬКО перенос единицы в знаковый разряд.
Сложение ЗНАКОВЫХ чисел при возникновении переполнения протекает неправильно , так как слагаемые могут представлять собой ТОЛЬКО беззнаковые числа (иначе при переносе единицы из шестого бита наличие единицы в знаковом разряде приведет к переносу из разрядной сетки; в результате переполнения не будет,а будет перенос). Поэтому перенос единицы в знаковый разряд приводит к появлению знакового (отрицательного) числа, что неправильно — сложение двух положительных чисел может иметь результатом только положительное число.
Сложение БЕЗЗНАКОВЫХ чисел в данном случае протекает правильно ,так как для этих чисел 7-й бит не играет особой роли и представляет собой лишь добавочный разряд; перенос в него не приводит к ошибке.
ПЕРЕНОС С ПЕРЕПОЛНЕНИЕМ ( CF=1,OF=1 ) — тогда,когда производится ТОЛЬКО перенос единицы из разрядной сетки.
Сложение БЕЗЗНАКОВЫХ чисел в данном случае протекает неправильно , так как перенос единицы из разрядной сетки приводит к потере старшего разряда.
Сложение ЗНАКОВЫХ чисел ТОЖЕ протекает неправильно , так как в результате переноса из разрядной сетки теряется знаковый бит,и сумма двух отрицательных чисел (а перенос с переполнением возможен только при сложении двух отрицательных чисел,т.к. для переноса единицы из разрядной сетки без переноса в знаковый бит необходимы единицы в старших разрядах обоих слагаемых) превращается в положительное число,что неправильно.
ОТСУТСТВИЕ ПЕРЕНОСА И ПЕРЕПОЛНЕНИЯ — тогда, когда нет переносов ни в знаковый разряд, ни из разрядной сетки.
На основании всего вышеизложенного может быть составлена следующая
Истинная таблица установки флагов переноса и переполнения для сложения:
| Перенос из разрядной сетки | Перенос в знаковый бит | Флаги |
| Есть | Есть | CF=1 , OF=0 |
| Есть | Нет | CF=1 , OF=1 |
| Нет | Есть | CF=0 , OF=1 |
| Нет | Нет | CF=0 , OF=0 |
Совершенно аналогично операциям сложения можно произвести ряд операций вычитания над знаковыми и беззнаковыми числами, отслеживая зависимость флагов OF и CF от наличия заемов из старшего и из "запредельного" разрядов.
Правила установки флагов переноса и переполнения для команды вычитания аналогичны тем, что уже излагались для команды сложения; единственное различие — вместо словосочетания "перенос в. " всюду следует подставить словосочетание "заем из. ". А
Истинная таблица установки флагов переноса и переполнения для вычитания
| Заем в 7-й(старший) бит | Заем из 7-го(знакового) бита | Флаги |
| Есть | Есть | CF=1 , OF=0 |
| Есть | Нет | CF=1 , OF=1 |
| Нет | Есть | CF=0 , OF=1 |
| Нет | Нет | CF=0 , OF=0 |
Итак, мы на собственном опыте убедились, как на деле сложен тот вопрос, от которого авторы популярных учебников отделались парой абзацев. Надеюсь, что данная статья поможет всем начинающим программистам быстро освоить этот непростой материал.
(c) 2003, Чугайнов Н.Г.
1 Видимо автор имел ввиду беззнаковое число. (прим. ред.)
2 Такое преобразование над числом так же называется дополнением до двух. А само представление отрицательных чисел — дополнительным кодом. (прим. ред.)
Переполнения разрядной
равенства в соответствии с обозначениями, принятыми в (11.10), и с учетом того, что С/2= _/2ZH (ZH — сопротивление нагрузки линии), можно переписать следующим образом:
Пользуясь зависимостью между максимальными значениями напряжения и тока, выражение для средней мощности можно переписать следующим образом:
В случае однородного поля условие самостоятельности разряда является условием пробоя промежутка, поэтому оно может быть использовано для определения пробивного напряжения. С этой целью его целесообразно переписать следующим образом:
Между собой уравнением С, = С, +л
. С учетом этого уравнение (7-21) можно переписать следующим образом:
формулу (1.23) можно переписать следующим образом:
Эти уравнения можно переписать следующим образом. Учитывая, что ги •?. г12, запишем первый член в правой части последнего уравнения в виде
Формулу (19. 16) можно переписать следующим образом:
Последнее уравнение можно переписать следующим образом:
Уравнение Шредингера (33.34) можно переписать следующим образом:
С учетом сделанных замечаний формулу (10.1) можно переписать следующим образом:
Как мы видели, при повышенных температурах атомы кристаллической решетки и примеси в ней приобретают способность хаотически двигаться по объему решетки подобно молекулам газа. Различие состоит в том, что длина свободного пробега атомов в кристалле практически равна межатомному расстоянию (К to а), так как перескок атома при диффузии происходит из данного узла (междоузлия) в соседний. Кроме того, решетка несколько ограничивает характер хаотического движения атомов, вследствие чего в (1.23) коэффициент 1/3 должен быть заменен некоторым коэффициентом а, зависящим от геометрии решетки и механизма диффузии. Наконец, роль т для кристалла должно играть эффективное время оседлой жизни-атома 9. Учитывая все это, (1.23) применительно к диффузии в кристаллах необходимо переписать следующим образом:
Признак переполнения разрядной сетки. При алгебраическом сложении двух чисел, помещающийся в разрядную сетку, может возникнуть переполнение, т. е. может образоваться сумма, Требующая для своего представления на один цифровой разряд больше по сравнению с разрядной сеткой слагаемых.
Можно сформулировать следующее правило (признак) для обнаружения переполнения разрядной сетки.
Признаки переполнения разрядной сетки те же, что были зафиксированы для смещенных кодов с положительным нулем.
справедливой в окрестности точки, где тангенс электрической длины линии порядка 108 или более. Тем самым ликвидируется возможность переполнения разрядной сетки ЭВМ. Вызов данной подпрограммы осуществляется из основного-программного модуля с помощью оператора
При подготовке компонентных данных может потребоваться масштабирование параметров элементов, полезное в тех случаях, когда в процессе выполнения вычислений может ожидаться возникновение таких больших значений, которые выходят за пределы представимых в ЭВМ значений и приводят к явлению переполнения разрядной сетки (большие значения, например, могут возникнуть при многократном умножении больших сопротивлений 106-106-106. ), либо очень малых значений, рассматриваемых в ЭВМ как нуль (малые значения могут возникнуть, например, при умножении малых емкостей 10
FI и F2 с шагом Т и Т/2, соответственно обозначенных именами Fl, F2, F3, F4. В блоке 4 (строки 3956—3958) устанавливается начальное состояние цепи в момент времени t=Q, т. е. х(0)=0. Увеличение текущего времени на шаг интегрирования и проверка условия окончания процесса интегрирования в блоках 5 и 6 осуществляются в строке 3960. Если текущее время превысит значение ?тах, расчет закончится. В блоке 7 (строка 3962) производится расчет входного сигнала (подпрограмма в строке 3990). Приводимая в строке 3990 запись определяет входной сигнал в виде единичного скачка, т. е. xBX(t) = \(t), поэтому результатом вычислений в программе будет переходная характеристика. В блоке 8 (строки 3964—3970) производится расчет с шагом Т значения х\(пТ-\-Т] по рекуррентной формуле (3.55). Для нахождения с уменьшенным вдвое шагом интегрирования значения х2(пТ->-Т) в блоках 9 и 10 (строки 3972—3976) осуществляется двукратный просчет по формуле (3.55). В качестве входных сигналов в моменты времени, соответствующие половине шага и целому шагу, берутся значения W(l) и W(2), рассчитываемые в строке 3990. В блоке // (строки 3978—3980) определяются отклики цепи h\(f) и МО- в блоке 12 (строка 3982) увеличивается счетчик (L) числа пройденных шагов. Если число пройденных шагов равно шагу вывода результатов расчета К (блок 13), производится в блоках 15—17 (строки 3984—3988) расчет относительной погрешности и вывод на экран дисплея значений текущего времени t, значений h\(t) и А2(0 (соответственно имена ТО, HI, H2, Е). Для исключения возможности переполнения разрядной сетки в случае деления на нуль при расчете
Изменение масштаба переменных. Операцию изменения масштаба используют при решении задачи сложения двух и более переменных (в целях выравнивания масштабов операндов), при выполнении операции деления (для исключения переполнения разрядной сетки) и в некоторых других случаях. Самостоятельной операции изменения масштаба процессор обычно не имеет, эта операция выполняется путем умножения машинной переменной на постоянный коэффициент k:
При проектировании вычислительных устройств необходимо решить вопрос о способе представления в машине положительных и отрицательных чисел и о признаке переполнения разрядной сетки (см. § 2-3). Указанный вопрос решается применением специальных кодов для представления чисел. При помощи этих кодов операция вычитания (или алгебраического сложения) сво-
Применение дополнительного или обратного кода для представления отрицательных чисел упрощает операцию алгебраического сложения. Алгебраическое сложение чисел с разными знаками заменяется арифметическим сложением кодов, при этом автоматически получается код знака результата. Однако остается нерешенным вопрос о выработке признака переполнения разрядной сетки.
Для получения признака переполнения разрядной сетки применяют модифицированные прямой, дополнительный и обратный коды. Эти коды отличаются от ра-
ке переполнения разрядной сетки (см. § 2-3). Указанный вопрос решается применением специальных кодов для представления чисел. При помощи этих кодов операция вычитания (или алгебраического сложения) сво-