Текст
                    С. Л. СЕРГЕЕВ
КОМПЬЮТЕРНАЯ АРИФМЕТИКА
Санкт-Петербург 1995

Санкт-Петербургский государственный университет С.Л.Сергеев КОМПЬЮТЕРНАЯ АРИФМЕТИКА Учебное пособие Санкт-Петербург 1995
Печатается по постановлению Редакционно-издательского совета Санкт-Петербургского университета Сергеев С.Л. Компьютерная арифметика: Учебное пособие. СПб., 1995. 79 С. В учебном пособии систематически рассматриваются вопросы представления данных в машине и алгоритмы выполнения различных арифметических и логических операций. Изложение ведется в общем виде, без привязки к конкретной машине. Это позволило рассмотреть практически все применяемые способы представления данных и все элементарные операции с ними. Изложенные вопросы являются первой частью курса "Архитектура ЭВМ и компьютерные вычисления." Книга рассчитана на студентов первого курса, однако может быть полезна всем, кто хотел бы уточнить и систематизировать свои знания в этой области. Рецензенты: докт. физ.-мат. наук, проф. И. Л. Братчиков (С.-Петербургский ун-т), докт. пед. наук, проф. И.В.Марусева (РГПУ им.Герцена) ISBN 5-87403-026-3 (С) Сергеев С.Л., 1995
Введение. УСТРОЙСТВО И РАБОТА ЭВМ. ПЕРВОЕ ПРИБЛИЖЕНИЕ Для понимания материала этого пособия можно ориентироваться на самую простую схему устройства ЭВМ На схеме простые стрелки указывают направления передачи управляю- щей информации, двойные - направления передачи перерабатываемой информации. Память предназначена для хранения исходных данных, программ - предписаний по переработке исходных данных в конечный резуль- тат, промежуточных и конечных результатов. Исходные данные посту- пают в память извне через устройство ввода, конечные результаты передаются вовне через устройство вывода. Данные - не обязательно числа. Это могут быть также буквы или другие символы. Поэтому и переработка данных - не обязательно вычисления. Процессор решает две задачи. Во-первых, он управляет работой всех остальных блоков компьютера, получая от этих блоков информа- цию о их состоянии. Во-вторых - выполняет хранящуюся в памяти программу. 3
Программа состоит из команд (в некоторых компьютерах они на- зываются инструкциями). Команды предписывают некоторые действия по переработке информации. Примеры таких действий - сложение, вы- читание, умножение, деление. Память представляет из себя набор одинаковых ячеек, каждая из которых имеет свой номер, он же - адрес. Так что каждая едини- ца информации - данное или команда - хранится в отдельной ячейке и, следовательно, - имеет свой адрес в памяти. Используется сле- дующая терминология. Про данные или команды, поступающие из уст- ройства ввода или из процессора, говорят, что они записываются в память. Если же данные или команды извлекаются из памяти для пе- редачи процессору или устройству вывода, то они читаются из памя- ти. Ячейка памяти обладает тремя важными свойствами. Первое: со- держимое ячейки (записанное в ней данное или команда) хранится сколь угодно долго, пока процессор не выполнит команду, предписы- вающую изменить содержимое этой ячейки. В некоторых видах памяти содержимое ячейки теряется также при выключении питания компьюте- ра. Второе: при записи в ячейку старое ее содержимое теряется и на новое содержимое никак не влияет. То есть фактически запись выполняется в два приема: сперва старое содержимое ячейки "стира- ется", а затем в пустую ячейку записывается новое содержимое. Третье: при чтении из ячейки ее содержимое не изменяется. То есть операцию "чтение" можно назвать копированием, так как при чтении сохраняется содержимое ячейки, а кроме того появляется его копия в другом месте - в процессоре или в устройстве вывода. Символьную информацию (в том числе и буквенную), а также ко- манды кодируют числовым кодом. Это удобно, так как позволяет еди- нообразно обращаться с содержимым всех ячеек - как с числами. Не- достаток этого приема - хранящаяся в памяти информация становится понятной лишь после декодирования. В современных компьютерах, кроме разве что некоторых специа- лизированных или экспериментальных, используется двоичная система счисления. Обычно разработчики компьютеров стремятся соединить в своих творениях сравнительно невысокую стоимость машины, универсаль- ность, понимаемую как способность выполнить любой алгоритм, и не- высокую стоимость программирования и решения большинства задач. Для этого, в частности, необходимо, чтобы имелась возможность 4
хранить и обрабатывать числа любой длины. Можно было бы иметь в машине ячейки очень большой длины. Однако во-первых, останутся задачи, хотя быть может и немного^ для которых и эта длина недос- таточна, во-вторых, стоимость такой машины и вычислений на ней будут высокими. В современных компьютерах эта проблема решается путем пре- доставления программисту на выбор нескольких возможностей: 1. Имеется один или несколько вариантов (форматов) представ- ления чисел, таких, что для записи, извлечения из памяти, обработ- ки числа требуется одна команда, которая выполняется процессором за время, близкое к минимальному в данной машине. Конструкторы машины рассчитывали, что основное ее применение - задачи, где по- давляющее большинство данных может быть представлено в одном из этих стандартных для данной машины форматов. 2. Имеется один или несколько вспомогательных форматов для записи и обработки чисел, которые изредка встречаются в любых за- дачах. Команды, обрабатывающие такие числа, работают в несколько раз дольше обычных. 3. Имеется возможность записывать в память числа произволь- ных форматов. Правда, для выполнения любых элементарных операций с ними потребуется составлять специальные, хотя и не очень боль- шие программы. Время для выполнения операций по обработке таких чисел может быть в несколько десятков раз больше, чем для обычных в данной машине чисел. Основное внимание в этом пособии уделяется первому и второму вариантам.
Глава 1. ПРЕДСТАВЛЕНИЕ ДАННЫХ В КОМПЬЮТЕРЕ $1. Системы счисления 1.1.Р-ичная система счисления Система счисления - это совокупность правил, позволяющих считать и кратко записывать числа. Подразумевается, что форма за- писи чисел должна быть удобной для выполнения арифметических опе- раций. В повседневной жизни мы используем десятичную систему счисления (можно также сказать: систему счисления с основанием десять). По аналогии с привычной для нас десятичной системой мож- но определить и другие системы счисления. Опишем, например, восьмеричную. Ее базу составляют 8 симво- лов (цифр) - 0,1,2,3.4,5,6,7. (В десятичной системе базу состав- ляют 10 символов - от 0 до 9.) Любое число в восьмеричной системе изображается только с помощью символов базы. (И точки, разделяю- щей целую и дробную части числа.) Выражение Ьп Ьп -1 • • • bi b0. b_ j Ь_ 2... Ь_ гл (*) составленное из символов восьмеричной базы, обозначает число . .+b181+b080+b-18’1+b_28-2 + . . .+b_m8'm (**j (В десятичной системе выражение (*) могло бы содержать цифры 8 и 9, а в выражении (**) всюду вместо восьмерок должны были бы сто- ять десятки.) Аналогично строятся и другие системы. Например, четверичная 6
система счисления имеет базу из четырех символов 0,1,2,3, любое число в ней изображается с помощью только этих символов, имеет вид (*) и обозначает iV’+bn-id"'1*.. .+bj41 +b04°+b_14'1+b.24'2 + . . .+b_m4'nl. Рассмотрим, к примеру, выражение 2301.21. Его можно интер- претировать и как десятичное, и как восьмеричное, и как четве- ричное число. Как десятичное: х=2хЮ3+ЗхЮ2+0хЮ1 + 1хЮ°+2хЮ"1 +1x10"2; как восьмеричное: х=2х83+Зх82+0х81 +1х8°+2х8-1+1х8"2; как четверичное: Х=2х43+Зх42+Ох41 +1x4°+2x4"1 +1x4’2. Очевидно, это совершенно разные числа, хотя и выглядят оди- наково. Во избежание путаницы, там, где из контекста не ясно, в какой системе счисления записано число, оно снабжается индексом 2х103+Зх102+0х101+1x10°+2x10"1+1х10-2 =2301.21j 0 , 2х83 +3х82 +0Х81 +1x8° +2x8"1 +1x8"2 =2301.21в . Обобщая, можно сказать, что система счисления с основанием р (2<р(10) имееъ базу 0,1,...,р-1. Любое число в этой системе запи- сывается в виде bnbn_i... bj b0. b_j b_2.. . b_m , где OCb^p-l , и ин- терпретируется как bnPn+bn-iPn'1+- • +bip1+b0p°+b_1p-,+b.2p-z+.. .+b_lnp-m. Надо заметить, что в качестве символов базы не обязательно использовать цифры. Можно использовать любые другие значки. Но все равно эти значки должны быть заменителями слов “ноль”, ’’один" и т.д. Понимание этого позволяет достичь еще большего обобщения. Пусть система с основанием р)0 (теперь р может быть и больше 10) имеет базу a^aj......ap_j - р различных символов. Тогда любое число, записанное в этой системе b^-j... bt b0. b_j b_2... b_m, где все at есть символы из базы, интерпретируется как bnPn+bn-iPn’l+- • •+b1p1 +b0p°+b_1p-1+b.2p-z+.. .+b_mp-m. Символы базы могут быть произвольны, но обычно используют цифры 7
от о до р-1, если р<10, или от 0 до 9 плюс дополнительные символы (если р>10). В частности, для шестнадцатеричной системы использу- ют символы: 0. 1,2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, Е, F. Правила счета в р-ичной системе такие же, как в десятичной. Надо только помнить, что после старшего символа базы идет число 10. Например, в восьмеричной О, 1,2, 3,4, 5, 6, 7, 10, И. 17,20...27,30.......77, 100, 101, .. . В шестнадцатеричной О, 1,2, 3, 4, 5, 6, 7, 8, 9, А, В, С. D, Е, F, 10, И.19, 1А, 1В.1F, 20, . . . . , 99, 9А, 9В, . . . , 9F, АО, А1.FF, 100, 101, . . . В двоичной О, 1,10, И, 100, 101,110, 111,1000,. . . Арифметические операции с числами в р-ичных системах выпол- няются по тем же правилам, что и в десятичной , только использу- ются свои таблицы сложения и умножения. Например, для р=2: Таблица сложения Таблица умножения \у X х 0 1 0 0 1 1 1 10 \у X 4 0 1 0 0 0 1 0 1 Для р=4: Таблица сложения х\у 0 1 2 3 0 0 1 2 3 1 1 2 3 10 2 2 3 10 И 3 3 10 И 12 Таблица умножения \у X 4 0 1 2 3 0 0 0 0 0 1 0 1 2 3 2 0 2 10 12 3 0 10 12 21 8
1.2. Правило перевода из одной системы счисления в другую Целые. Перевести целое число х в р-ичную систему, значит представить его в виде bn bn _ t... bt Ьо , где bi - символы из базы р-ичной системы. Для этого надо найти многочлен x=bnpn+bn.1pn-1+.. • +b1p‘+b0 . Очевидно, можно записать этот многочлен в виде x=Xjp+b0 , rjfe Xi=bnpn’1+bn.iPn"2 + .. .+bi . Следовательно, b0 - младшая цифра р-ичного представления числа х и может быть получена как остаток от деления х на р. Частное - Xj представим, в свою очередь, как сумму Xi=x2p+bj. Следовательно, следующая, вторая справа цифра р-ичного представ- ления числа х есть остаток от деления Xj на р. Продолжая делить каждое новое частное на р, будем получать все новые остатки, яв- ляющиеся последовательными (справа налево) цифрами числа х в р-ичной системе. Последнее частное, меньшее р, будет старшей циф- рой х. Пример. Перевод числа 199510 в восьмеричную и в шестнадцате- ричную системы. В восьмеричную 1995 8 16 --- ---- 249 8 39 24 --- 32 --- 31 8 --- 9 24 — 75 8 — 3«- это частное < 8 (четвертый остаток) - а3 72 - 7«- это третий остаток - а2 — 1«- это второй остаток - aj 3 - это первый остаток - а0 Итак, 1995ю=37138 . 9
В шестнадцатеричную 1995 16 16 16 124 39 112 32 — 7=а2 — 1^1 о “Ci 6 -а1 75 64 Hi о “Bi 6 -ао Итак, 199510=7СВ16 . Числа, меньшие единицы. Переведем теперь число у, меньшее 1, из десятичной системы в р-ичную. Будем искать у в виде многочлена у=Ь_, р~1+Ь-гР‘г+Ь_3р'3+.. .+b.mp-m . который определяет р-ичную форму числа у: Ур=0.Ь.1Ь.гЬ.3.. .ь.„. Преобразуем многочлен к виду У=Р-1 (b-i+yj) , где У1 =Ь_2р"1+Ь_3р-2+ .. .+b_rnp~m*1 . Из того, что yt <1, заключаем, что произведение ухр имеет целой частью a.j - первую слева цифру р-ичного представления числа у. Умножая У! на р, получим число, целая часть которого - вторая цифра ур и т.д. Заметим, что мы еще только ищем представление у в виде мно- гочлена. Заранее нам не известны не только его коэффициенты, но и степень го. Иногда на каком-то шаге оказывается, что ух=0. Тогда процесс перевода заканчивается (1=го). Чаще этого не происходит слишком долго, поэтому мы должны решить, сколько коэффициентов будем искать. (Иными словами, с какой точностью требуется выпол- нить перевод в р-ичную систему.) 10
Пример. Перевод десятичного числа 0.1995 в восьмеричную и в шестнадцатеричную системы. В восьмеричную В шестнадцатеричную 0. 1995 х 8 0. 1995 х 16 1. 5960 х 8 3. 1920 х 16 4. 7680 х 8 3. 0720 х 16 6. 1440 х 8 1. 1520 х 16 1. 1520 х 8 2. 4320 х 16 1. 2160 х 8 6. 9120 х 16 1. 7280 14. 5920 Итак, 0.199510=*0.146111в*0.33126Е16 . Как следует из выведенного нами правила, число, появившееся перед точкой в последующем умножении не участвует (отделено вертикаль- ной чертой). Ответ получается при прочтении сверху вниз того, что расположено левее вертикальной черты. Равенства, разумеется приближенные, так как процессы перево- да не закончены и младшие цифры восьмеричного и шестнадцатерично- го чисел отброшены. Точные переводы получаются редко - в восьме- ричную, лишь когда число у может быть представлено в виде дроби вида y=z/8k, где z - целое. Аналогично с шестнадцатеричной систе- мой. Здесь должно существовать представление вида y=z/16k. Если при этом z не делится на 8 (на 16), то к - количество цифр в восьмеричном (шестнадцатеричном) представлении числа. 11
Еще один пример. Перевод числа О.Ю2510 . В восьмеричную В шестнадцатеричную 0. 1025 х 8 0. 1025 х 16 0. 8200 х 8 1. 6400 х 16 6. 5600 х 8 10. 2400 х 16 4. 4800 3. 8400 Итак, 0. Ю2510=0.0648=0. 1А316 . Общее правило перевода. Теперь общее правило перевода чисел из десятичной системы в р-ичную. Число разбивается на две части - целую и дробную (левее точки и правее). Каждая часть переводится в р-ичную систему по своему правилу - для целых и для меньших единицы. Полученные числа являются целой и дробной частями ре- зультата. Их объединяют в одно число (слева от точки и справа). Пример. Перевод числа общего вида - 96.9610 В восьмеричную целая часть дробная часть 0. 96 х8 7. 68 х8 961 о 0. 96t о =0. 7538 96. 96j о = 14О. 7538 . 12
В шестнадцатеричную целая часть дробная часть 96 16 0. 96 96 6 96j 0 =60j 6 X16 0 15. 33 xl6 5. 28 X16 4. 48 96.9610=60.F5416 . O.96lo=O.F5416 Для перевода из системы счисления с основанием q в систему с основанием р можно воспользоваться правилом перевода из десятич- ной системы в р-ичную с единственным изменением - деление и умно- жение должны выполняться в q-ичной системе счисления. Для примера переведем число 140в в десятичную систему. q=8, р=10, следовательно вычисления надо производить в восьмеричной системе. 140в 12в (=10j0) 12в ------------ ---- И8 (=910) 208 12, 68 (=610) 1408=96jо. Поскольку такие вычисления очень сложны своей непривычностью, пе- ревод из произвольной системы в десятичную иногда выполняют по более простому правилу. При этом объем вычислений больше, но ве- дутся они в десятичной системе. Вот это правило. От числа bnbn_t...bjbo.b-jb.g.. .b-m , переходят к многочлену ЬпРп+Ьп-1Рп’1+- • .+b1p1+b0p°+b.ip-*+b.2p-2 + . . .+Ь.л1р-|Л , 13
значение которого вычисляется в десятичной системе. Например, 140. 758 = 1х82+4х81+0x8°+7x8"1+5х8’2=64+32+7/8+5/64 ~ 96.959. 1.3. Двоичная и вспомогательные системы Для хранения р-ичного n-разрядного числа в памяти компьютера служит ячейка, состоящая из п одинаковых элементов. Каждый эле- мент - это устройство, способное находиться в одном из р устойчи- вых состояний. Каждому символу базы ставится в соответствие одно из состояний устройства. Записать символ в элемент ячейки значит привести этот элемент в соответствующее состояние. Элементы ячей- ки упорядочены, как и разряды в числе, так что в каждый элемент записывается свой, вполне определенный разряд числа. Элементы ячейки называют также разрядами. Наиболее простые и надежные устройства хранения и переработ- ки информации работают с двоичными числами. Разряды этих уст- ройств - двоичные. Двоичные разряды называют также битами, так как в них размещается один бит - минимальная единица информации. Базу двоичной системы составляют символы 0 и 1. Вот как выглядят в двоичной системе некоторые числа: Десятичные 0 1 2 3 4 5 6 7 Двоичные 0 1 10 И 100 101 110 111 Десятичные 8 9 10 И 12 13 14 15 Двоичные 1000 1001 1010 1011 1100 1101 1110 1111 Десятичные Двоичные 16 10000 32 100000 64 1000000 1024 10000000000 14
Из таблиц видно, что двоичные числа значительно длиннее десятич- ных, но по ним невозможно оценить во сколько раз. Оценим эту ве- личину. Пусть число х состоит из п разрядов в десятичной системе и из m - в двоичной. Это значит, что выполняются неравенства 10п-1 С х < 10п и С х < 2т . Логарифмируя их по основанию 2, получим: (n-l)xlog210 С log2x < nxlog210 и т-1 < log2x < т . log2x удовлетворяет двум неравенствам одновременно, поэтому max[ (n-l)xlog210, т-1] < log2x < mln[nxlog210, т] . Следовательно, (n-l)xiog210 < т и т-1 < nxiog210. Отсюда log210 - log210/n < m/n < log210 + 1/n . Так как log210 ~ 3.3 , имеем 3.3 - 3.3/n < m/n <3.3 +l/n . Таким образом, при n порядка 10 двоичные числа длиннее деся- тичных примерно в 3 - 3.4 раза. Использование двоичной системы счисления добавляет к обычной для недесятичных систем трудности - непривычности, еще одну - очень большую длину чисел. Работа с ними утомительна и увеличива- ет вероятность ошибок. В то же время преимущества использования двоичной системы в компьютерах столь убедительны, что не позволя- ют от нее отказаться. Компромисс найден в использовании одной из вспомогательных систем - восьмеричной или шестнадцатеричной (для каждого типа компьютера выбирается одна из них). Дело в том, что переводы из восьмеричной системы в двоичную и обратно, так же как и из шест- надцатеричной в двоичную и обратно, настолько просты, что могут быть выполнены человеком очень быстро даже в уме. Поэтому исполь- зуется такая схема: компьютер работает с двоичными числами, а че- ловек читает и записывает их как восьмеричные (или шестнадцате- ричные), мысленно осуществляя перевод из одной системы в другую. В этой схеме сохраняется непривычность манипулирования с недеся- 15
тичными числами, однако длина этих чисел примерно такая же, как и десятичных. Возьмем произвольное целое двоичное число: bnbn_i... ^ Ьо. Запишем его в виде многочлена bn2n +bn_ i 2П-1 +. . . +b525 +b424 +b323 +b222 +bj 21 +b02° . Рассмотрим сумму трех правых слагаемых b222+bj21+b02°. Оче- видно, что эта сумма лежит в диапазоне от 0 до 7 и может быть за- менена одной восьмеричной цифрой. Обозначим ее через с0. Возьмем теперь следующие три слагаемых: b525+b424+b323. Вы- нося за скобки 23, замечаем, что сумму в скобках можно заменить одной восьмеричной цифрой. Пусть это будет Cj b525+b424+b323 = (b522+b421+b32°)x23=C1x8. Следующие три слагаемых будут иметь общим множителем 26, а выражение в скобках снова заменим восьмеричным - с2. Аналогично будем поступать с каждой следующей тройкой слага- емых. Если число слагаемых в многочлене не кратно трем, добавим слагаемое вида 0x2n+1 или два слагаемых: 0x2n*2+0x2n+1 с тем, чтобы последняя группа слагаемых также была тройкой. В результате придем к новому многочлену ck8k+ck_i 8k-1 +.. .+с181+с08°, где к равно n/З, (п+1)/3 или (п+2)/3 (выбирается целое). Но это соответствует восьмеричному числу ск ск _ j...Cj с0. Теперь возьмем двоичное число, меньшее единицы 0. Ь_ 1 Ь_2Ь_3... b_m Построим соответствующий многочлен b_j 2"1+b_22"2+b_32"3 + . . .+b_m2"m. Рассмотрим сумму из трех левых слагаемых. Если в ней вынести за скобки 2"3, то в скобках получится сумма, которую можно заменить одной восьмеричной цифрой. Обозначим ее c.j. 16
b-iS’1 +b_22-2+b_32-3 = (b_ j 22+b_221+b_32° )x2-3 . В следующих трех слагаемых за скобку вынесем 2-6. Сумму в скобках заменим восьмеричной цифрой с_2. Аналогично будем действовать q/каждой следующей тройкой сла- гаемых. Если m не кратно трем, добавим слагаемое СхЗ-”1"1 или 0х2‘т-1+0х2-т’2 так, чтобы последняя группа слагаемых также ока- залась тройкой. В результате получим новый многочлен: с_ j 8’1+с_ 2 8'2 +...+с_ г 8’г, соответствующий восьмеричному числу 0.c_iс_2...с_г , где г=т/3, (т+1)/3 или (т+2)/3. Общее правило перевода из двоичной системы в восьмеричную. 1 .Начиная от десятичной точки, влево и вправо объединяем цифры двоичного числа в тройки (триады), дополняя, при необходи- мости, число нулями слева и справа. 2 .Каждую триаду заменяем соответствующей восьмеричной циф- рой Двоичная триада Восьмеричная цифра ООО 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7 Правило перевода из восьмеричной системы в двоичную. 1.Каждую восьмеричную цифру заменяем соответствующей триадой (именно триадой, т.е. О заменяем на ООО, 1 - на 001 и т.д.). 2.Отбрасываем слева и справа лишние нули. Если в этих двух правилах слова "восьмеричная" заменить на "шестнадцатеричная", "тройки" на "четверки", а "триады" на "тет- рады", то получим правила перевода из двоичной системы в шестнад- цатеричную и обратно.Ниже приведена соответствующая таблица. Двоичная тетрада Шестнадцатеричная цифра 0000 0 0001 1 0010 2 ООН 3 0100 4 0101 5 ОНО 6 0111 7 Двоичная тетрада 1000 1001 1010 1011 1100 1101 1110 1111 Шестнадцатеричная цифра 8 9 А В С D Е F 17
Примеры перевода из двоичной системы. х=1011011101.1001111 В восьмеричную Разбиваем на триады Joi Joi J10J100L1J1 Дополняем И U 001 011 011 101.100 111 100 Заменяем восьмеричными цифрами X=1335.4748 Примеры перевода В шестнадцатеричную Разбиваем на тетрады loLioJiioiliooJin нулями U 1 0010 1101 1101.1001 1110 Заменяем шестнадцатеричными цифрами x=2DD.9Е16 в двоичную систему. Х=124.1248 Заменяем цифры триадами 001 010 100.001 010 100 х=124.124,6 Заменяем цифры тетрадами 0001 0010 0100.0001 0010 0100 Отбрасываем лишние нули 1010100.0010101 I 100100100.0001001001 Обычно проблемы перевода из одной системы счисления в другую скрыты от человека, работающего с компьютером: человек передает компьютеру информацию в десятичной системе, компьютер переводит ее в двоичную, обрабатывает в двоичной системе, а перед выдачей результатов человеку переводит их в десятичную систему. Редко, но все же иногда приходится общаться с компьютером на его языке. При этом человек формулирует входную информацию и по- лучает выходную в восьмеричной или шестнадцатеричной системе. Пе- ревод в двоичную и обратно осуществляется на уровне устройств ввода/вывода: мы нажимаем клавишу, на которой изображена, напри- 18
мер, шестнадцатеричная цифра, а клавиатура передает в процессор соответствующую тетраду. И наоборот, из процессора передается двоичный код, а в принтере или на экране монитора каждой тетраде кода соответствует шестнадцатеричная цифра, которая и печатается. 1.4. Другие системы счисления Рассмотренные нами системы счисления называют системами с неотрицательной базой, так как существуют системы, в которых часть элементов базы отрицательна. Например, "троичная с симметричной базой". ( Имеется в виду симметрия относительно нуля.) В ней элементы базы - 0, 1, и -1 (последнюю цифру обозначают как 1 ). Вот как выглядят некоторые числа в этой системе: Десятичные 0 1 2 3 4 5 6 7 Троичные 0 1 11 10 И 1ТГ 110 141 Десятичные 8 9 10 27 81 243 729 Троичные ЮТ 100 101 1000 10000 100000 1000000 Здесь число по-прежнему интерпретируется как многочлен, но коэф- фициенты могут быть и отрицательными. К примеру, числу 1ТГ соот- ветствует многочлен 1х32-1х31-1x3° =5, а числу ЮТ - многочлен 1х32+0х31-1хЗ° = 8. Троичная система с симметричной базой некоторое время кон- курировала с двоичной в качестве кандидата для представления чи- сел в компьютерах. Арифметические операции в ней почти так же просты, как в двоичной, а длина чисел примерно на треть меньше. Действительно, наименьшее и наибольшее из троичных чисел, имеющих к знаков, состоят из к отрицательных и к положительных единиц сооответственно и выглядят так: 19
Xfflln= И1....11 Xfnax = 111....11 - к штук - -к штук -» т.е. все х, имеющие к знаков, удовлетворяют неравенству 3к-1_3к-2_3к-з_ < х < 3k-i+3k-2 +i Используя формулу для суммы геометрической прогрессии, получим 3*-1 -(3*-1-1)/2< х с (Зк-1)/2 ИЛИ Зк-1 /2 + 1/2С Х< Зк/2 -1/2. Усилим последнее неравенство, отбросив 1/2: Зк-1/2 < х < Зк/2 и добавим требование, чтобы соответствующее десятичное число имело п цифр: 10п’1< х <10п . Прологарифмируем оба неравенства (n-l)xlog310 < k-l-log32 и nxlog310 > k-log32 . Откуда nxlog310 +l-log35 < к < nxlog310 + log32. Таким образом, приближенно 2.1 - 0.47/n < k/n < 2.1 + 0.63/n . Другим достоинством троичной системы является единообразие изображения положительных и отрицательных чисел. Здесь не требу- ется знаков и "+". Десятичные -1 -2 -з -4 -5 -6 -7 Троичные т п ТО IT Til Tio Т1Т Просто изменять знак числа: все Т надо поменять на 1, а 1 на Т. Двоичная система победила лишь благодаря значительно большей надежности хранения и манипулирования в двоичной системе, чем в троичной. Возможно, что победа эта не окончательна. Р-ичной системе счисления не обязательно иметь неотрицатель- ную или симметричную базу. Ниже приведены разновидности пятирич- ных систем счисления (в первом столбце - система с неотрицатель- 20
ной базой, в третьем - с симметричной). Заметим, что только сис- теме с неотрицательной базой требуется специальный знак для изображения отрицательных чисел. Десятич - ные числа БАЗА СИСТЕМЫ 0, 1,2, 3,4 1,0,1,2,3 2, 1,0, 1,2 5,5,1,0,1 0 0 0 0 0 1 1 1 1 1 2 2 2 2 13 3 3 3 12 12" 4 4 11 11 1Т 5 10 10 10 10 6 И и И и 7 12 12 12 133 8 13 13 22 152 9 14 21 21 131 10 20 20 20 130 И 21 21 21 131 12 22 22 22 123 15 30 30 120 120 20 40 1Т0 1Го 1То 25 100 100 100 100 1995 30440 31 ОТО iSioIo 12юГо Следует подчеркнуть, что основание системы счисления - это вовсе не число символов базы.Система счисления может иметь даже отрицательное основание. Например, система с основанием -2 и ба- зой, состоящей из цифр 0,1. Числа в этой системе интерпретируются как и обычно полиномом 21
a^-Z^+an-j (-2)"-!+.. ,+aj (-2)1 +a0 (-2)°. Вот как выглядят некоторые числа в этой системе счисления: Основание 10 0 1 2 3 4 5 6 7 Основание -2 0 1 110 111 100 101 11010 11011 Основание 10 Основание -2 8 11000 9 11001 10 11110 И 11111 12 11100 13 11101 14 10010 15 10011 Могут быть системы с иррациональным или даже комплексным ос- нованием. Все перечисленные системы являются позиционными. В них зна- чение цифры зависит от занимаемой ею позиции в числе. В числе 1991 первая единица означает одну тысячу, а последняя - одну еди- ницу, первая девятка - девять сотен, а вторая - девять десятков. Римская система - непозиционная. В ней нет определенной базы и значения цифр не зависят от занимаемого места.Правда, они иног- да прибавляются, а иногда вычитаются XXXVIII=10+10+10+5+l+l+l=38, MCMXCI =1000-100+1000-10+100+1=1991. Непозиционной является также самая простая из систем счисле- ния - единичная. В ней используется только одна цифра - 1, а зна- чение числа равно количеству единиц llli=3, ШШ^б. Есть также целая группа непозиционных систем счисления, име- ющих, возможно, перспективу практического использования в компь- ютерах. Их называют системами в остаточных классах (СОК). В тео- рии чисел доказано, что если п^.тг.......тп- попарно взаимно прос- тые числа, то каждому числу х, при 0<x<m1m2... mn> взаимно-одноз- 22
начно соответствует набор остатков от деления х на пц ,т2.......тп. Пусть, например. mi=7, т2=11, т3=13. т1хт2хт3=1001. Любому неот- рицательному числу, если оно не превышает 1000, соответствует три остатка (от деления на 7,11,13). Причем ни одно другое число из этого диапазона не имеет того же набора остатков. Число 100 в та- кой системе запишется как 2,1,9; число 200 - как 4,2,5; число 1000 - как 6,10,12. Интерес к СОК связан с тем, что в этих системах арифметичес- кие операции могут выполняться быстрее, чем в позиционных систе- мах. Если, например, в системе с базой пц.тг.Шз два числа предс- тавлены остатками х - aj, а2, а3 и у - bt, b2, Ь3, то числу z=x+y со- ответствуют остатки с!,с2,с3, где c^at+bi или, если а^Ь^г^, ci=ai+t)i-mi (1=1.2,3,). Отсюда видно, что все остатки могут вы- числяться независимо, а следовательно, одновременно, что повысит скорость вычислений. Аналогично обстоит дело с другими операция- ми. Однако СОК имеют существенные недостатки, среди которых - сложность вычислений с дробными числами, что препятствует их ши- рокому внедрению. $2. Представление двоичных чисел 2.1.Целые Будем рассматривать представление двоичных чисел в ячейке памяти, состоящей из п двоичных разрядов. В компьютерах разных типов длина ячеек различна, да и в одном компьютере обычно ис- пользуются ячейки с разными п. Ячейки с п=8 называются байтами. В примерах будем использовать ячейки с п = 8,16,32. (Они, по-види- мому, наиболее распространены.) Беззнаковые числа.Прямой код. Ячейки с п двоичными разрядами как раз достаточно для записи n-разрядного целого двоичного числа х (без знака). Так как двоичные числа состоят только из нулей и единиц, наибольшее n-разрядное двоичное число х^х состоит из п 23
единиц, а наименьшее - из п нулей. Для быстрого перевода числа хтах = Ш- • • 11 «-п штук-* состоящего из п единиц, в десятичную систему достаточно сообра- зить, что оно на 1 меньше числа вида 1000...00 -п штук-» Но это число равно 2П. Таким образом, х^х = 2п-1. Следовательно, в байте, например, можно записать любое целое без знака от 0 до 28-1=255, а в двухбайтовой ячейке - от 0 до 65535. В ячейках целые числа выравниваются по правому краю. Это вы- ражение означает, что правые границы числа и ячейки совпадают, т.е. разряд единиц числа записывается всегда в крайний правый разряд ячейки. Если число имеет меньше разрядов, чем ячейка, то в левые, свободные разряды ячейки записываются нули. Например, чис- ло 1 записывается в байте как 00000001, число 1710=Ю0012 - как 00010001. При записи в ячейку целых со знаком один разряд приходится отводить для запоминания знака. Обычно знаковым объявляется самый левый разряд ячейки. В знаковый разряд записывается 1, если’число отрицательно, 0 - если положительно. Для хранения самого числа остается п-1 разряд. Поэтому наибольшее число со знаком имеет вид 011... И «- п-1 -» что соответствует 2п-1-1. Для байта это 127, для ячейки из двух байт - 32767. Рассмотренная система кодирования целых со знаком, в которой левый бит отводится под знак, а остальные - под абсолютное значе- ние числа, называется прямым кодом. Кроме прямого, в компьютерах используются обратный, дополнительный и смещенный коды. Обратный код. Положительные числа в обратном коде записыва- ются так же как в прямом. Изменения касаются только отрицательных чисел. Для получения обратного кода отрицательного числа все биты 24
прямого кода ( кроме знакового ) заменяются на противоположные. Вот обратные коды некоторых двухбайтовых чисел: Число Прямой код Обратный код 32767 0111111111111111 0111111111111111 +5 0000000000000101 0000000000000101 + 1 0000000000000001 0000000000000001 -1 1000000000000001 1111111111111110 -5 1000000000000101 1111111111111010 -32767 1111111111111111 1000000000000000 Между прямым и обратным кодами отрицательных чисел имеется соотношение: 1хпр | + |хобр Н211"1-!, где п - размер ячейки в битах. Если число двухбайтовое, то 1хпр|+|хо6р1=111111111111111= 215-1. Очевидно,что для получения прямого кода отрицательного числа следует применять ту же процедуру, т.е. обратный код хо6р есть хпр . (хОбР)ОбР = хпр • Дополнительный код. Дополнительный код положительных чисел совпадает с их прямым кодом. Для получения дополнительного кода отрицательного числа его сначала переводят из прямого кода в об- ратный, а затем прибавляют 1, т.е. |хдоп|=|хо6р1+1. Или получают непосредственно из прямого: (Хд^^11*1 - |хпр| Примеры. Число Прямой код Дополнительный код 32767 0111111111111111 0111111111111111 +5 0000000000000101 0000000000000101 + 1 0000000000000001 0000000000000001 -1 1000000000000001 1111111111111111 -5 1000000000000101 1111111111111011 -32767 1111111111111111 1000000000000001 Здесь также имеет место формула (Хд о п ) д о п “ Хпр 25
С прямым, обратным и дополнительным кодами связана проблема двух нулей. Вот ее суть. Во многих алгоритмах содержится операция сравнения некоторо- го результата с нулем. Например, чтобы определить, разделился ли х на у без остатка, надо сравнить остаток с нулем. Так как, по определению, остаток имеет знак делимого, при делении без остатка может получиться как +0, так и -0. И хотя +0=-0, их прямой и об- ратный коды различны: Число Прямой код Обратный код +0 0000000000000000 0000000000000000 -О 1000000000000000 1111111111111111 Поэтому, действуй мы в прямом или в обратном коде, нам придется сравнивать остаток как с одним, так и с другим кодом нуля. При попытке получить дополнительный код числа -0 из его об- ратного кода возникнет перенос единицы за пределы ячейки. (Полу- чится число 10000000000000000.) Однако такой результат в дополни- тельном коде не является переполнением. Выходящяя за пределы раз- рядной сетки единица должна быть просто отброшена. (Это станет ясно после изучения операции сложения в дополнительном коде в гл. 2.) Таким образом, дополнительные коды чисел +0 и -0 совпадают: (+0)доп=(-0)доп=0000000000000000. За счет этого диапазон предста- вимых чисел в дополнительном коде на единицу больше, чем в прямом и обратном Число Прямой код Обратный код Дополнительный код -32768 не представимо не представимо 1000000000000000 Смещенный код. Недостатком дополнительного кода (как и обра- тного) является наличие различных правил их формирования для по- ложительных и отрицательных чисел. Смещенный код свободен от это- го недостатка. Идея смещенного кода заключается в том, чтобы вов- се не иметь знакового бита. Вся ячейка, включая знаковый бит, ис- пользуется для записи беззнакового кода. Коды положительных и от- рицательных чисел образуются по единой формуле хсмец= 2”’1 + хпр. 26
В частности, для двухбайтовой ячейки хсме1Ц = 215 + хпр Примеры. Число Смещенный код 32767 +5 + 1 0 -1 -5 -32767 -32768 1111111111111111 1000000000000101 1000000000000001 1000000000000000 0111111111111111 0111111111111011 0000000000000001 0000000000000000 Таким образом, все положительные числа и ноль имеют 1 в ле- вом бите, а отрицательные - 0. Как и в дополнительном коде, здесь нет проблемы двух нулей и представимо число -32768, не имеющее прямого кода. Вообще-то рассматривать отдельно знаковый бит не обязательно и в обратном и дополнительном кодах. Можно считать, что положи- тельные и отрицательные числа, состоящие из п-1 бита, кодируются беззнаковыми числами, состоящими из п бит. хо6р образуется из |хобр| приписыванием к числу из п-1 бита единицы в бит п, что можно записать в виде формулы ХО6р=2п',+ |хо6р|. Аналогично для дополнительного кода. Таким образом, формулы перевода из прямого кода в обратный и в дополнительный можно переписать так: I хпр при хпр>0 I хпр при хпр>0 ХОбр г • Хд0П=А | 2п-1+хпр при х<0 | 2п+хпр при Х<0 Рисунок показывает связь между числами в диапазоне от -8 до +7 с их беззнаковыми кодами в четырехбитовой ячейке. Символа- ми "х" на рис.1 отмечены точки, соответствующие прямым кодам 27
чисел. "о" - обратным, - дополнительным, "а" - смещенным. Т------1----1-----1----®------1-----1-----1-----1----1-----г -8 -6 -4 -2 0 2 4 6 8 Число Рис.1. 2.2. Дробные числа Числа с фиксированной точкой. В общем случае двоичное число имеет как целую, так и дробную части, разделенные точкой. Получа- ется, что для изображения двоичного числа общего вида надо иметь пять различных знаков: для изображения нуля, единицы, знаков "+" и и точки, разделяющей целую и дробную части. Однако двоичный разряд ячейки способен хранить лишь 0 или 1. Изображая знак числа нулем (если знак - плюс) или единицей (если знак - минус), мы не путаем его с частью самого числа лишь потому, что договариваемся записывать знак в конкретном (обычно самом левом) бите. Аналогично приходится договариваться о положении точки в чи- слах. Но точка - всегда точка ( в отличие от знака, который может 28
быть + или -). поэтому для нее не нужно отводить бит. Можно запи- сывать подряд целую и дробную части числа, каким-то образом ука- зывая, между какими битами должна стоять точка. Указаний не тре- буется, если машина работает лишь с числами определенного вида. Рассмотрим случай, когда используются только числа, по абсо- лютной величине меньшие единицы. Все они имеют вид ±0. b-iЬ_2... b_k , где bt - какие-либо двоичные цифры. Поэтому можно договориться, что символ "О", стоящий рядом со знаком, и следующий за ним сим- вол не изображаются (эти символы неизменны), а число записы- вается в память в виде сокращенного кода 6Ь_ 1 Ь_ 2 • • • b_ k , где 6=0, если число положительное, 6=1, если отрицательное. Про такие записи говорят, что в них точка фиксирована перед левой цифрой числа. Если все двоичные числа по абсолютной величине меньше 2, то они имеют вид —bg . Ь_ J Ь_ 2 • • • b_ k В этом случае можно опускать точку (она всегда стоит после левой цифры числа) и записывать число в память в виде 6Ьд Ь_ J Ь_ 2 • • Ь_ k Частным случаем чисел с фиксированной точкой являются целые - у них точка фиксирована после крайней правой цифры. Существуют машины, работающие только с числами с фиксирован- ной точкой. Такое ограничение не является препятствием к тому, чтобы считать их универсальными, так как любые вычисления могут быть сведены к вычислениям с фиксированной точкой. Пусть, например, требуется вычислить выражение у=(6.3x0.5+2)/(12.8+0.7) . 29
Его можно привести к виду у=[ (0.63x0. 5+0. 2)/(0. 128+0. 007) ]х0. 1 . Все числа, входящие в это выражение, и все промежуточные резуль- таты вычислений меньше единицы. Поэтому вычисления могут быть проведены на машине с точкой, фиксированной перед первой цифрой. Преимущество таких машин - простота вычислений (они ведутся с однотипными числами). Это позволяет делать их более дешевыми. Недостаток - необходимость предварительных преобразований, кото- рые могут оказаться довольно сложными. Числа с плавающей точкой. Еще один способ записи чисел - с плавающей точкой. В этом случае все числа приводятся к виду х = MxXSP’ , где Мх - мантисса числа х, рх - его порядок. Мантисса - число с фиксированной точкой, имеющее тот же знак, что и х, порядок - це- лое со знаком; S - число, характеризующее данную систему кодиро- вания, одинаковое для всех х в этой системе. Обычно, если х - де- сятичное, S=10, если х - двоичное, то S=2 или S=16. В последнем случае можно считать,что х - шестнадцатеричное, так как мантиссы х в обеих системах выглядят одинаково. Например, число х=16.12510 может быть записано в форме с плавающей точкой х=0.16125хЮ2 или х=0.016125х103, или х=0.00016125х105, или х=1612.5x10"2 и т.д. Это же число в двоичной системе счисления можно записать так: х=10000.001x2° или х=1.0000001x2'00 , или х=0.10000001x2'01 , ИЛИ Х=0.0010000001x2'11 И Т.Д 30
(Здесь, как и в следующем примере, все показатели степени записа- ны, естественно, в двоичной системе.) То же число в двоичной сис- теме, но при S=16 х=10000.001x16° или х=1.0000001Х161, или Х=О.ООО1ОООООО1Х1610 И Т.Д. Очевидно, что количество вариантов в каждой системе кодиро- вания неограничено. Однако не все они годятся для записи в память машины: мантисса в память записывается как число с фиксированной точкой. То есть записывается не сама мантисса, а ее сокращенный код, отличающийся от нее хотя бы отсутствием точки. В большинстве машин должно быть |МХ|<1. В них код отличается от мантиссы еще и отсутствием нуля перед точкой. В приведенных примерах под требование |МХ|<1 подходят первые три варианта записи чисел в десятичной системе, два последних в двоичной с 3=2 и один - с S =16. Так как S в каждой системе фиксировано, для запоминания чис- ла х необходимо записать в ячейку только два числа: рх и Мх. Поэ- тому ячейка делится на 4 части: для знака рх, для |рх|, для знака Мх, для I Мх | TI— 1рх1 ----------ЧТ1«---- тх --------------->1 знак рх знак Мх тх - это сокращенный код |МХ|. Как размер ячейки, так и деление ее на части для каждой ма- шины свое, фиксированное (программист не может выбирать их по своему усмотрению). В некоторых машинах имеется несколько фикси- рованных вариантов. Во всех случаях для знаков отводится по одно- му биту, а для модуля порядка - меньше, чем для модуля мантиссы. Как правило порядок записывается в коде со смещением, поэто- му здесь нет отдельной позиции для знака. рх называют истинным порядком, а его код, записываемый в память - Пх- машинным поряд- ком. 31
Мантисса записывается в память в прямом коде, поэтому здесь знаковая позиция имеет самостоятельное значение. Ее даже часто отделяют от позиции модуля мантиссы. Чаще всего разделение ячейки на части выглядит так: Т14 Пх * 14 mx * I знак Мх Число называется нормализованным, если для его изображения используется вариант, при котором порядок имеет наибольшее воз- можное значение. Например, в системе с S=2 и |М|<1 число х =11.011 в нормали- зованном виде выглядит как 0.11О11х210, число у=0.00101 - как О.1О1Х2’10. В память запишутся тх=11011 и тх=101. Формальным признаком нормализованности в этой системе является единица в крайней левой позиции. В системе с S=2 и |М|<2 нормализованный вид первого числа - 1.1011x2х, второго - 1.01x2х1. Машины с S=2 и |М|<2 обычно рабо- тают исключительно с нормализованными числами. Очевидно, в этом случае перед точкой всегда стоит единица, поэтому в сокращенном коде ее опускают. Для таких машин тх=1011 и тх=01. В системах с S=16 и |М|<1 в первой позиции нормализованного числа не обязательно находится 1. Здесь левая тетрада должна быть ненулевой. Те же х и у в этих системах выглядят так: Х=11.011=0.0011011x16х , у=0.00101=0.00101x16° , то есть тх =0011011, ту =00101. 2.3. Диапазон и точность Диапазон и точность представления в памяти чисел относятся к наиболее важным характеристикам компьютера. Обычно оценка возмож- ностей машины ведется для ее стандартных форматов, так как иначе 32
можно говорить о практически неограниченных диапазоне и точности. Будем рассматривать ячейку памяти, состоящую из п+1 разряда, один из которых отводится под знак числа. Остальные п разрядов отводятся под модуль числа, если в ячейку записывается целое или число с фиксированной точкой; для записи в ту же ячейку чис- ла с плавающей точкой п разрядов делятся на две части - к раз- рядов - для записи порядка, s разрядов - для мантиссы (k+s=n) п+1 к ---------ф-------------- s Рассмотрим следующие характеристики ячейки: 1. Максимальное представимое число - х^х. 2. Минимальное по абсолютной величине, отличное от нуля чис- ло - х^. 3. Абсолютная погрешность представления числа (ошибка округ- ления) - Ах. 4. Относительная ошибка - 5х= Ах/х. Найдем эти характеристики для случаев, когда в ячейке хра- нится: а) целое число; Ь) число с фиксированной точкой (при х<1); с) число с плавающей точкой (при |М|<1, S=2, П=р+2к-1); d) число с плавающей точкой в той же системе кодирования, но с дополнительным условием - мантисса обязательно нормализована (0<IМ|<1). Максимальное и минимальное числа. Очевидно, что код макси- мального числа во всех четырех случаях будет состоять из единиц во всех разрядах, кроме знакового. Код максимального числа для случаев а и b 0111..................................И 33
для случаев end 0111...11111..................И I— к—1|<--------- s ---------->1 Минимальное число для первых трех случаев имеет единицу в крайнем правом разряде, в остальных разрядах - нули; для четвер- того случая единицы должны стоять в крайнем левом разряде мантис- сы, в остальных - нули. Код минимального числа для случаев а и b 0000...............................001 |<--------- п-1 ------------>| для случая с 0000. .. 00000............. 001 I- к-| |<------- s-1 ------->1 для случая d 0000... 00100...............ООО I- к-| |<------- s-1 ------->1 Это соответствует числам Формат Xfnax Xffl 1 п Целые 2п-1 1 С фиксированной точкой 1-2'п 2'п С плавающей точкой не нормализованные 2Т(2*-1-1)х(1-2-3) 2Т(-2к"‘)х2’3 С плавающей точкой нормализованные 2Т(2к'1-1)х(1-2‘3) 2f(-2к-1 )х2‘* 34
Отбрасывая малые слагаемые, получаем приближенно Формат Xfflax XfD 1 П Целые 2П 1 С фиксированной точкой 1 2-п С плавающей точкой не нормализованные гкг11-1-!) ги-г'-'-з) С плавающей точкой нормализованные гиг*-1-!) 2Т(-2к-‘-1) Абсолютная погрешность. Так как ячейка имеет фиксированное количество разрядов - п для записи модуля числа, то любое число из п+1 или более разрядов может быть представлено в такой ячейке лишь приближенно. Приближенное значение получают или округлением до ближайшего числа из п разрядов, или просто отбрасыванием лиш- них разрядов. При приближенной записи чисел с фиксированной точкой макси- мальное отброшенное число имеет вид 0.000......... 00111... , где количество единиц может быть любым. Это число меньше, чем 0.000....... 001 I*— п-1 —>1 а это значит, что максимальное отброшенное число меньше, чем 2’п. Очевидно, что для любых чисел с фиксированной точкой Ах < 2-п. ( Если при записи производится округление, то по- 35
грешность еще меньше, т.е. неравенство выполняется тем более.) При записи в ячейку целых чисел мы отбрасываем дробную часть, т.е. погрешность не превышает 1. При записи чисел с плавающей точкой погрешность мантиссы не превышает, как и для чисел с фиксированной точкой, единицы пос- леднего разряда - 2’3. То есть точное значение мантиссы лежит в пределах ^точное ~ 3 < ^приближенное очное Умножив неравенство на 2Рм , получим диапазон для приближенного представления самого числа ^точное 2₽* 3 < ^приближенное < ^точное- Абсолютная погрешность - это разность между точным значением х и приближенным. Отсюда следует, что Дх < 2Р*'3. (Конечно, все рас- суждения велись для положительных чисел. В общем случае неравенс- тво принимает вид |Дх|< 2Р«-3.) Таким образом, абсолютные погреш- ности для трех форматов можно свести в таблицу Формат Дх Целые 1 С фиксированной точкой 2-п С плавающей точкой 2Р* -з Из таблицы видно, что в первом случае абсолютная погрешность ни от чего не зависит. Во втором - зависит от размера ячейки: чем больше в ней разрядов, тем меньше погрешность. В формате с плава- ющей точкой абсолютная погрешность не зависит от значения мантис- сы, поэтому она одинакова для нормализованной и ненормализованной мантисс. Она зависит только от длины мантиссы и от порядка числа. Так как -2к-1 <рх < 2й"1-!, абсолютная погрешность в этом фор- мате лежит в широком диапазоне 2X-2k‘1-s) С Дх < 2f(2k’1-l-s) . 36
Диапазоны абсолютных погрешностей сведены в таблицу Формат mlnAx Дх тахДх Целые 1 1 1 С фиксирован, точк. 2-п 2~п 2‘п С плавающей точкой 2T(-2k-‘-s) 2Рм -s 2Т(2к’1-S-1) Относительная погрешность. В инженерных приложениях имеют дело с относительной погрешностью. Измеряя расстояния между звездами, пренебрегают километрами, измеряя радиус Земли, - метрами, размеры мебели, - миллиметрами и так далее. То есть объекты разных размеров измеряются в разных единицах ( световой год, километр, метр и так далее ). Считается, что измерения двух сильно различающихся по размерам или даже во- обще несоизмеримых объектов одинаково точны, если они выполнены с одинаковой относительной погрешностью - бх = Дх/х. С относительной погрешностью связаны выражения типа: ’’Изме- рить с четырьмя верными знаками” или "Вычислить с точностью до пяти верных цифр"; с абсолютной - "Измерить с четырьмя вер- ными знаками после запятой" или "Вычислить с точностью до пяти верных цифр после запятой". Относительные погрешности целых чи- сел и чисел с фиксированной точкой зависят от того, какое это число. Для целых бх = 1/х. Поэтому l/x^ < бх < l/x^n , т.е. l/(2n-l) < бх < 1 или 2'п < бх ( 1. Для формата с фиксирован- ной точкой бх = 2"п/х . Поэтому 2’п /(1-2’п) < бх с 2’п/2’п или 2"п < бх С 1. В формате с плавающей точкой бх = 2Рх-3/(2р*х Мх) = 2‘3/МХ. Мантиссы нормализованных чисел лежат в диапазоне 1/2 < Мх < 1, поэтому для них 2‘3 < бх С 2"3*1 У ненормализованных чисел 2-s < Мх < 1, поэтому 2-3 < бх < 1. Ниже приведена таблица относительных погрешностей для разных форматов. 37
Формат mln5x бх гоахбх Целые 2"п 1/х 1 С фиксированной точкой 2"п 2'п/х 1 С плавающей точкой без нормализации 2"3 2“3/МХ 1 С плавающей точкой с нормализацией 2^ 2'3/МХ 2-s + i Таким образом, относительная погрешность целых чисел и чисел с фиксированной точкой лежит в одинаковом очень широком диапазо- не. Причем, если в левой части этого диапазона относительная пог- решность может быть вполне приемлемой, то в правой - совершенно неудовлетворительна. Что касается формата с плавающей точкой без нормализации, то здесь диапазон сужен, причем за счет его ле- вой стороны, так как s<n, т.е. в целом относительные погрешности хуже. Если же рассматривать только нормализованные числа, то здесь диапазон относительных погрешностей очень узок. То есть, исполь- зуя этот формат, мы обеспечиваем практически одинаковую погреш- ность для всех чисел, которая зависит только от количества знаков мантиссы. Замечания о выборе формата. 1.Форматом целых пользуются обычно не для приближенных, а для точных вычислений, когда целое не получено отбрасыванием дробной части, а является целым по своей природе (например, число студентов в аудитории). В этом случае погрешность просто отсутс- твует. 2.Вычисления с фиксированной точкой проще, чем с плавающей, они обеспечивают постоянную низкую абсолютную погрешность. Если |х|>2"к , то 2"п < бх < 2-3 , что лучше, чем с плавающей точкой. 3.Вычисления с плавающей точкой при нормализованной мантиссе 38
обеспечивают гарантированную.достаточно низкую относительную пог- решность для любых чисел из очень широкого диапазона. 4. Использование ненормализованных чис'ел целесообразно только в том случае, когда числа выходят из диапазона представимых в нормализованным виде. $ 3.Предотавление текстов 3.1. Кодирование символов Обработка информации не сводится только к вычислениям. Компьютер должен хранить и перерабатывать нечисловую информацию, записанную буквами и другими символами. Для размещения символов в двоичной памяти компьютера исполь- зуются их двоичные коды. Существует много систем кодирования сим- вольной информации. Наиболее распространенными в настоящее время являются различные вариации ASCII-кода (American Standard Code for Information Interchange). В этом коде каждому символу ставит- ся в соответствие определенная комбинация из восьми нулей и еди- ниц - один байт. Например, код символа А - 01000001, В - 01000010, Z - 01011010. Для строчных букв используются свои коды: а - 01100001, b - 01100010, z - 01111010. Для краткости при записи кодов на бу- маге или на экране используют шестнадцатеричную систему. В ней символу А соответствует код 41, В - 42, Z - 5А, а - 61, Ь - 62, z - 7А. Аналогично кодируются и другие символы, которые могут встретиться в тексте: 2В - код символа "+" ,2D - , 28 - " (", 29 - ")" , 2С - , 21 - "!" и так далее. В тексте могут встретиться и числа. Если не предполагается выполнять с числом каких-либо арифметических операций (например, когда это - номер квартиры или автомобильный номер), то целесооб- разно не переводить его в двоичную систему, а рассматривать как последовательность символов - составляющих число десятичных цифр. В ASCII код нуля - 30, единицы - 31 и так далее. Код девятки 39
- 39. Например, число 91 в ASCII кодируется как 0011100100110001; число 723 - как 001101110011001000110011. Всего символов, используемых в американских текстах, около ста. и для их кодирования достаточно комбинаций из семи нулей и единиц (такими комбинациями можно закодировать 128 различных сим- волов). Первоначально ASCII и состоял из семи бит. Однако потом возникла идея хранить в памяти компьютера в закодированном виде не только тексты, но и таблицы и простые схемы. В связи с этим появилась необходимость запоминать элементы графики (горизонталь- ные и вертикальные черточки различной толщины, их пересечения и т.д.). Это увеличило количество символов и привело к появлению восьмибитового расширенного ASCII-кода. Восьмибитовый код позво- ляет записывать 256 различных символов. Американский восьмибито- вый стандартный код кодирует около двухсот символов, поэтому в нем остается значительное количество свободных кодов. Они могут быть использованы для кодирования букв национальных алфавитов (русского, греческого и других). Отсюда - различные модификации ASCII-кода. В некоторых компьютерах используется другой код - EBCDIC (Expanded Binary Coded Decimal Interchange Code). Так же как и в ASCII, каждому символу ставится в соответствие восьмибитовая ком- бинация или эквивалентная пара шестнадцатеричных цифр. В обеих системах кодирования старшая часть кода (левая шест- надцатиричная цифра) называется зоной, а младшая - цифрой. Кодирование символов так же просто, как и перевод чисел из вспомогательных систем счисления - восьмеричной и шестнадцатерич- ной в двоичную. Да и процесс такой же: используя таблицу, заменя- ем каждый символ его двоичным кодом. Отличие лишь в том. что при переводе из восьмеричной системы каждая цифра заменяется триадой, при переводе из шестнадцатеричной - тетрадой, а при кодировании символов - байтом. Так что переводы восьмеричных и шестнадцате- ричных чисел в двоичную систему и обратно можно называть кодиро- ванием восьмеричных и шестнадцатеричных чисел и декодированием. Как и переводы во вспомогательные системы счисления, кодиро- вание и декодирование символов выполняют устройства ввода и выво- да без участия человека или процессора - нажимая клавишу с изоб- ражением символа, мы вызываем появление комбинации из восьми бит. приход комбинации из восьми бит в устройство вывода вызывает по- явление соответствующего символа. 40
3.2. Кодирование десятичных чисел Как уже говорилось, числа, являющиеся частью текста, рассма- триваются как символы и кодируются двумя шестнадцатеричными циф- рами. Вместе с тем часто возникает задача•хранения больших масси- вов чисел, внутри которых нет ни одного другого символа. Так как у всех цифр одна и та же зонная часть, ее можно опустить. При этом, правда, нам необходимо помнить, что в данной части памяти хранятся цифры без зонной части. Такой способ записи десятичных чисел называется упакованным форматом или двоично-десятичным ко- дом - BCD (Binary Decimal Code). Например, число 1995 в ASCII записывается в четырех байтах как 00110001001110010011100100110101 или в краткой, шестнадцате- ричной, записи как 31393935. В упакованном формате это же число имеет длину два байта - 0001100110010101. Записывать десятичные числа в двоично-десятичном коде очень просто: нужно каждую цифру перевести в двоичную систему и записать в виде тетрады - совокуп- ности четырех нулей и единиц. Упакованные форматы в ASCII и EBC- DIC, естественно, совпадают. Итак, с вводимым в память компьютера десятичным числом можно поступить трояко: l.E ro можно хранить в памяти как последовательность символов ("распакованный формат" ASCII). В таком виде числа обычно посту- пают в память. 2.Ч исло можно "упаковать". К этому обычно прибегают, если большое количество чисел расположено подряд. 3.Ч исло можно перевести в двоичную систему. Так поступают с числами, которые будут участвовать в массовых вычислениях. Примеры. Десятичное Двоичное BCD ASCII 7 111 111 00110111 10 1010 10000 0011'000100110000 39 100111 111001 0011001100111001 88 1011000 10001000 0011100000111000 41
3.3. Битовые строки Для каждой системы кодирования характерно свое деление ячей- ки памяти на поля (части) и интерпретация этих полей. Записывая в ячейку целое, мы делим ее на два поля: из одного левого бита и из всех остальных. Запись в левом поле интерпрети- руется как знак числа, в правом - как модуль числа. При записи чисел с плавающей точкой ячейка делится на три поля: поле знака, поле порядка и поле мантиссы. Символы целиком занимают байт (хотя и его, в значительной степени условно, делят на зонную и цифровую части). В упакованном формате байт делится на два одинаково ин- терпретируемых поля - в нем записываются два независимых символа. Наряду со стандартными, широко распространенными, использу- ются системы кодирования специальные, частные. От местных или ве- домственных стандартов до личных, используемых зачастую в од- ной-единственной программе. При этом поля могут иметь совершенно произвольные размеры, от одного бита до многих байтов. Цель инди- видуальной системы кодирования - экономное использование памяти машины. Представим себе, например,систему записи анкетных данных. Будем данные выписывать из анкеты подряд всегда в одном и том же порядке, отводя под каждый тип данных всегда одно и то же коли- чество бит. Например, под фамилию - 20 байтов (чтобы наверняка хватило), под год рождения - 1 байт (две последние цифры), под номер телефона - 3,5 байта (7 цифр), под пол - 1 бит (кодируя, например, нулем - женский, единицей - мужской) и т.д. Другой пример. Представим себе, что отдельные лица отвечают на вопросы некоего теста. Все вопросы требуют ответа "да" или "нет". Кодируя слово "да" цифрой 1, а слово "нет" цифрой 0, ре- зультаты опроса каждого лица можно представить как набор цифр 0 и 1. Хотя этот набор будет внешне выглядеть как многозначное двоич- ное число, на самом деле это именно набор независимых битов. Та- кие наборы называют битовыми строками. Понятие битовых строк распространяют и на такие наборы, в которых отдельные последовательности битов объединены в группы, как в предыдущем примере. То есть, вводя любое нестандартное для данной машины деление ячейки на поля, мы вводим битовую строку.
Глава 2.КОМПЬЮТЕРНЫЕ ВЫЧИСЛЕНИЯ §1.Операции с битовыми строками Самая простая из машинных операций - это пересылка, суть ко- торой заключается в копировании содержимого одной ячейки памяти в другую. Операции с битовыми строками относятся к числу наиболее простых для процессора. По времени выполнения они близки с пере- сылкой . 1.1.Логические сдвиги Пусть ячейка из п битов содержит битовую строку вида ап -1 ап - 2 • • ко- операция сдвиг влево логический (в дальнейшем будем пользовать- ся аббревиатурой SLL от английского Shift Left Logical) превраща- ет ее в новую строку: ап_2ап_3...аоО. Происходит последовательный перенос всех битов строки на одну позицию влево. При этом бит, бывший крайним левым, выходит за пределы ячейки и теряется. Спра- ва освобождается один бит, и в него заносится 0. Схематически процесс изображен ниже 43
Если к полученной битовой строке снова применить опера- цию SLL, то получим новую строку: ап_3ап_2••-аоОО; к-кратное применение операции приведет к сдвигу исходной строки на к позиций. В некоторых компьютерах есть команда с параметром SLLk. В этой команде мы имеем возможность указать параметр к - величину сдвига. Если, например, к исходной строке применить операцию SLL2, то результатом будет ап_3ап_2...аоОО. Это позволяет нам од- ной командой выполнить то, что команда простого сдвига SLL выпол- няет за несколько раз. Параметр может принимать любые разумные значения (очевидно, что при k=n битовая строка превратится в ну- левую, а сдвиг на k>n не имеет смысла, так как его результат та- кой же, как и при k=n). Операция сдвиг вправо логический - SRL (от Shift Right Logi- cal) выполняется аналогично и । । । । । = = = = = = । । । । ii О ----- - ----> н 1 । । । । ______ । 1 1 1 л и переводит исходную битовую строку в Oan_jап_2...aj. В машинах, где есть операции с параметром SLLk, есть и SRLk. Так как при сдвигах часть битов теряется, оказывается, что SRLk(SLLk(х)) * х, хотя SRLk(SLLk(х)) = SLLk(SRLk(х)). В некоторых компьютерах имеется операция сдвиг влево цикли- ческий - SLC. Она выполняется по схеме 1г I I I |— Г — — — — — — I | | I || и переводит строку в ап_2ап_3... аоа^ . Аналогично выполняется операция SCR. В некоторых машинах имеется операция с параметром SLCk. При этом операции SRCk может и не быть, так как SLCk = SRCn_k. Встречается операция обмен. Она меняет местами левую полови- ну битовой строки с правой по схеме 44
Эта операция эквивалентна SLCn/2 1.2.Операции математической логики Эти операции называют также "булевскими операциями", а пере- менные, с которыми эти операции производят, называют "булевскими переменными". Булевские переменные отличаются от обычных тем, что могут принимать только два значения: 0 и 1. В булевской алгебре (говорят также "булева алгебра") рассматриваются различные бу- левские функции от одной, двух и более переменных. Булевская функция, во-первых, может быть вычислена только от булевских пе- ременных, а во-вторых, сама может принимать только булевские зна- чения - 0 или 1. Интересно, что количество различных булевских функций от к пременных конечно. Рассмотрим функции одной переменной: y=f(x). Их всего 4. значения х 0 1 значения функций У1 -fl (X) fo 0 0 fl 0 1 f2 1 0 f3 1 1 Первую из этих функций можно записать как Го(х) = 0, послед- нюю - как f3(х) = 1, вторую - как ft (х) = х. Все они неинтересны. 45
Лишь третья используется в некоторых компьютерах. Ее называют инверсией или отрицанием или просто не. Действительно, если y=f2(x), то это значит, что у противоположно х, отрицает его. f2(х) имеет специальное обозначение: у= х или у = 1х. Заметим, что значения , прочитанные как единое двоичное число, дают i. Например, значения f2 составляют число 00Ю2=210, значения Г15 составляют число 11112=1510. Отсюда, между прочим, следует, что число различных булевских функций от к аргументов равно 22к. Практически во всех компьютерах имеются операции, реализую- щие три булевских функции двух переменных, с вариантами названий: а) "и", "логическое умножение", "конъюнкция"; Ь) "или", "логическое сложение", "дизъюнкция"; с) "исключающее или", "сложение по модулю 2". Их обозначения: a) z = хАу или z = х AND у; b) z = xvy или z = х OR у; с) z = (x+y)mod2 или z = х XOR у. Для описания этих функций используют так называемые таблицы истинности: 46
Очевидно, что это соответствует функциям предыдущей таблицы Ц. г7. г6. Можно пользоваться также словестными описаниями: а) только если х и у одновременно равны 1 z = 1; b) только если х и у одновременно равны 0 z = 0; с) только если х = у z = 1. Все остальные булевские функции двух аргументов легко полу- чаются как комбинации этих трех. Операции математической логики в компьютерах реализованы как групповые: аргументами операций являются битовые строки и опера- ция выполняется над каждой парой битов. Если х = -1 &п - 2 • • • а0. У = Ьп _ J Ьп _ 2 • • • ьо, то результат операции z = х*у - битовая строка вида Z = Cn _ i сп _ 2 • • со , где Ci = ai*bi для 1= 1,2, ...,п-1. Здесь символ "*" означает про- извольную операцию математической логики. Вообще-то следовало бы говорить: "команда группового логического умножения", однако дру- гих команд логического умножения в компьютерах не бывает, поэтому говорят просто, хотя и неточно: "команда логического умножения". Аналогично обстоит дело и с другими командами математической ло- гики. Команды математической логики используются для обработки части ячейки - для выделения, стирания или изменения некоторых ее битов. Пусть, например, из информации, хранящейся в ячейке, нас интересует в данный момент только ее часть, расположенная в битах 1,2 и 4 47
an - 1 an - 2 • • • a5 a4 a3 a2 al ao • Достаточно выполнить команду логического умножения этой битовой строки на строку вида 00...010110 , <--- п ----► и мы получим новую строку 00... 0а40а2а! О Пусть ячейка имеет размер байта. И пусть ее содержимое - 01101101. Тогда, в результате его логического умножения на 00010110. получим 000000100. Пусть информация, хранящаяся в би- тах 1,4,5 и 7, устарела и должна быть заменена на новую. Замену можно выполнить в два приема: 1.Стирание устаревшей информации. 2.Запись новой. Стирание выполним с помощью логического умножения. Для этого байт со старой информацией а7а6а5а4а3а2ajа0 умножим на байт вида 01001101 (нули в позициях 1,4,5,7, в остальных - единицы). Ре- зультат - Оа6ООа3а2Оао . Запись новой информации выполняем логическим сложением полу- ченного байта с битовой строкой b70b5b4OObj0 (bi.b4.b5.b7 - новая информация). Результат Ь7а6Ь5Ь4а3а2а0. Команду "исключающее или" можно использовать, например, для инверсии части битов ячейки. Результатом применения этой операции к байтам а7 а6 а5 а4 а3 а2 at а0 и 01100100 будет а7а6а5а4а3а2а1 а0, т.е. инверсия байтов 2, 5 и 6. 1.3.Маски Давно известен простой способ шифрования информации с по- мощью шаблона. Пусть, к примеру, надо записать короткое сообщение - имя из пяти букв - в строку, имеющую двенадцать позиций. Если имя длиннее пяти букв, будем лишние отбрасывать, если короче,- дополнять точками. Используем шаблон - полоску бумаги, на которой нарисованы 12 клеточек 48
Вырежем отверстия на месте пяти клеточек, выбранных произвольно. Например, так: (соответствующие клеточки отмечены крестиками). Теперь наложим наш шаблон на чистый лист бумаги, предназначенный для записи со- общения и впишем это сообщение в отверстия. Например, Снимем шаблон и в пустые позиции впишем любые буквы и знаки. Прочитать это сообщение может лишь тот, кто имеет шаблон. Наложив шаблон, мы закроем все ненужные буквы. Вообще-то совсем не обязательно прятать сообщение среди "му- сора". Можно в эту же строку записать сообщение из 12 букв, ис- пользуя, например, последовательно три шаблона по четыре буквы. Сообщение 49
р а а с л а е н к . д записано и может быть прочитано с помощью трех шаблонов: Шаблоны могут использоваться и для того, чтобы скрыть часть информации. Например. Подробные анкетные данные сотрудников, хранящиеся в отделе кадров, являются частично конфиденциальной информацией. Домашний адрес и некоторые другие данные не сообщаются посторон- ним, в то время как рабочий телефон, номер кабинета и т.д. - отк- рытая информация. Можно изготовить шаблон, наложив который на ан- кету, мы закроем, замаскируем конфиденциальную информацию и оста- вим доступной открытую. В связи с такой функцией шаблона его на- зывают также маской. В компьютерах в качестве маски может быть использована любая строка битов. При этом единицы в строке играют роль прорезей в шаблоне. Так, например, если прочитать 50
байт а6 а5 а^ а^ а^ а^ ад по маске 00101000 получим 0 0 а50 а30 0 0. Заметим, что эта операция эквивалентна логическому умножению бай- та на маску. Ее называют прочитать по маске. Используется также операция собрать по маске. Она "читает по маске" и сдвигает прочитанное в левый край байта - результата. Остальные биты заполняются нулями. Например, байт 11011000, соб- рать по маске 00101000. 1.Чтение 2.Сдвиг и заполнение нулями 11011000 00101000 О 1 а 01000000 Команда разобрать по маске последовательно берет биты исход- ного байта, начиная с левого, и расставляет их в позиции, поме- ченные в маске единицами. Остальные позиции заполняются нулями. исходный байт 01000000 а маска 00101000 I I расстановка бит 0 1 заполнение нулями 00001000 52. Арифметика целых Двоичная система хороша не только тем, что записанные в ней числа удобно хранить, но и тем. что выполнение арифметических операций в двоичной системе чрезвычайно просто. Для сложения многозначных двоичных чисел достаточно исполь- зовать таблицу сложения 51
z = x+y \у X 4 0 1 0 0 1 1 1 10 и обычное правило переноса единицы в старший разряд. (Аналогичная таблица для десятичной системы имеет размер 10x10.) Для умножения "в столбик" таблицы умножения и вовсе не тре- буетб 1011 xlOOl + 1011 1011 1100011 Как видно из примера, если в множителе 1, то множимое просто переписывается под черту с соответствующим сдвигом, если 0, то пропускается. Особенностью компьютерной арифметики является проблема пере- полнения. Она заключается в том, что для записи результата любой арифметической операции заранее отводится ячейка определенного размера, с определенным количеством разрядов, а результат может содержать больше разрядов, а значит может не помещаться в ячейку. Обычно это означает, что дальнейшие вычисления не имеют смысла. В этом случае выполнение программы надо закончить и выдать сообще- ние о переполнении. В некоторых случаях программист знает, что может произойти переполнение, но считает возможным продолжить вы- числения при условии, что факт переполнения станет ему известен. Так или иначе, но оказывается необходимым, и в компьютере выраба- тывается, специальный признак переполнения, если результат не по- мещается в отведенное для него место. Иногда можно заранее, до выполнения вычислений, сказать, что переполнения не будет. (Например, при вычитании положительных чи- 52
сел.) Поэтому, описывая арифметические операции, обычно приводят условия возникновения переполнения. 2.1.Операции с беззнаковыми числами Иногда числа, хранящиеся в ячейках памяти, интерпретируются как целые без знака. Пару таких чисел можно сложить или вычесть из одного другое. При этом результат также интерпретируется как беззнаковый. (В некоторых машинах такие операции реализованы.) При сложении может возникнуть переполнение. Оно возникает всякий раз, когда сумма больше 2п-1. При вычитании переполнение получиться не может, однако, если вычитаемое больше, чем уменьша- емое, возникает похожая ситуация: результат операции должен быть беззнаковым, а получить таковой невозможно. Еще один тип операций с беззнаковыми числами - сложение n-значных чисел по модулю 2т или по модулю 2т-1. Общее обозначе- ние операций сложения по модулю А - z = (х + y)modA. Алгоритм сложения по модулю А 1. Вычисляется сумма х+у. 2. Сумма делится на А. 3. Результатом объявляется остаток от деления. Результат операций этого типа всегда неотрицателен. Перепол- нение возникнуть не может. Сложение по модулю 2т - частный случай описанных операций и выполняется проще 1. Вычисляется сумма х+у. 2. В качестве результата берутся го младших цифр суммы. Действительно, пусть сумма двух n-значных чисел имеет вид спсп_1...с0. Поделив ее на 2т , получим: Сп Сп - 1 • • • Ст . Ст _ ! . . . Со . Т Указанная стрелкой точка разделяет целую и дробную части суммы, т.е. получилось спсп_!сп_2...ст + (ст_j...с0)/2т, следовательно, cm-i---c0 - остаток. В компьютерах обычно m = п. В этом случае 53
для вычисления остатка необходимо лишь отбросить сп, если он об- разовался. То есть такую операцию можно интерпретировать как сло- жение с игнорированием переполнения. Сложение m-значных чисел по модулю 2т-1 выполняется так: 1. Вычисляется сумма Zj = х+у. 2. Если Zj < 2m , то z = Zj. 3. Если Zj > 2m , то есть zt состоит из m+1 бита, то отбра- сывается левый бит и к результату прибавляется 1. Иными словами х+у , если х+у < 2т х+у-2т + 1, если х+у > 2т Этот вид сложения называют циклическим, его реализуют с по- мощью циклического счетчика: 1Г'Г । -f=f о T=il н 1 I 1 I В обычном счетчике, если х+у ) 2т, старшая единица результа- та теряется, - ее некуда передать. В циклическом - как за первым разрядом идет второй, за rn-2-м - m-1-й, так же за m-l-м идет ну- левой, счетчик зациклен. Поэтому единица переноса из старшего разряда, если она образовалась, прибавляется к младшему разряду. 2.2. Сложение и вычитание целых в прямом коде. Сравнение и признаки результата Для выполнения сложения целых чисел в прямом коде необходимо сперва проверить, имеют ли они одинаковые знаки. Если да, то аб- солютные величины этих чисел складываются и сумме присваивается их знак. Если нет, то абсолютные величины нужно вычесть (из боль- шей меньшую) и разности присвоить знак большей. Пусть х и у - слагаемые, a z - их сумма. Введем обозначе- ния ДЛЯ X 54
1 при X > о X = бхх|х| , 6Х -1 при X < О И аналогичные для у. Теперь опишем этот алгоритм более формально. Алгоритм ADD. (По английски add - сложить.) 1. Если 6ххбу=1, то перейти к 2, иначе - к 3. 2. z: = бхх (| х I +1 у I). Конец. 3. Если |х|>|у|, то перейти к 4, иначе - к 5. 4. z:= 6хх( |х| -1 у I). Конец. 5. z:= бух( |у|-|х|). Конец. Вычитание знаковых чисел заменяется сложением после изменения знака вычитаемого на противоположный. Алгоритм SUB. (От английского subtract - вычесть.) 1 • бу • — — бу 2 . z:= х+у (выполнить алгоритм ADD). Заметим, что для реализации этого алгоритма надо уметь опре- делять, какое из двух чисел по абсолютной величине больше. Мы де- лаем это очень легко, "с одного взгляда”, однако для компьютера это не так-то просто. Надо выполнять специальный алгоритм, заклю- чающийся в следующем. Сравнивают крайние левые разряды чисел х и у (не знаковые); если они совпадают, то переходят на одну позицию вправо и сравни- вают следующую пару разрядов. Если и они совпадают, - переходят еще на один разряд вправо и т.д. Обнаружив несовпадающую пару разрядов, объявляют большим то число, в котором соответствующий разряд равен 1. Сравнение является частью некоторых арифметических операций и в то же время обычно имеется и самостоятельная операция сравне- ние. Ее задача - определить, какое из двух чисел, х или у, боль- ше. Результат операции можно представить в виде двухбитового чис- ла СС (от Condition Code; в отечественной литературе его называют признаком результата), определяемого по правилу СС = О при х = у 1 при х > у 2 при X < у 55
Операция выполняется как вычитание. При этом, однако, сам результат вычитания не фиксируется, а сохраняется только его признак. Алгоритм СМР. (От СоМРаге - сравнивать.) 1. СС := бх_у . Конец. Признак результата нужен для управления разветвлениями алго- ритма. С другой стороны, он так легко получается как побочный ре- зультат арифметических операций, что в большинстве компьютеров эти операции устроены таким образом, что наряду с самим результа- том отдельно фиксируют также его признак. То есть в большинстве машин алгоритмы сложения и вычитания выглядят так: Алгоритм ADD. (Вариант 2.) 1. Если бххбу = 1, то перейти к 2, иначе - к 3. 2. z:= бхх(|х|+|у|). Перейти к 6. 3. Если |х|>|у|, то перейти к 4, иначе - к 5. 4. z: = бхх(|х|-|у|). Перейти к 6.. 5. z: = бух(|у|-|х|). 6. СС: = 6Z . Конец. Алгоритм SUB (Вариант 2 ) 1. бу:= -бу . 2. z: = х+у . 3. СС:= 6Z . Конец. Кстати, при переполнении, которое может возникать как ре- зультат арифметических операций, фиксируется признак результата СС=3. 2.3.Сложение и вычитание в дополнительном коде В операциях сложения и вычитания дополнительный код числа рассматривается как единое n-битное беззнаковое число, т.е. опре- деляется формулой |хпр при х>0 2П - |хпр| при х<0. 56
Операции выполняются над кодами в целом,т.е. складываются и вычи- таются беззнаковые n-битные коды. Будем обозначать через z число, равное сумме чисел х и у: z = х+у, через z‘ - код, который получится при сложении допол- нительных кодов х и у: z* = хдоп + удоп. Обозначим биты дополни- тельного кода числа х через а!, числа у - через , числа z - че- рез Cj: Хдоп ап-1 ап_2 • • • а0 » Удоп ьп-1 Ьп-2 • • • Ьо » 2доп = Cn сп - 1 сп _ 2 • • • Со . Естественно, результат может иметь и п+1 бит, но это не всегда означает переполнение. Например, при сложении положительного чис- ла с отрицательным переполнение исключено, однако, поскольку bn_i=l, возможно, что и сп=1; при сложении же двух отрицательных чисел сп=1 всегда, так как и an_i, и bn_t равны 1. Поэтому бу- дем отдельно рассматривать три случая: 1) х>0, у>0; 2) х>0, у<0; 3) х<0, у<0. (Случай х<0, у)0 аналогичен случаю 2.) При этом бу- дем решать две проблемы: а) как по n+1-битному коду z* получить гдоп; Ь) как определить, что наступило переполнение. Для решения второй проблемы будем следить за состоянием битов сп и Cn-i. Случай 1 (х ) 0, у > 0). Так как оба слагаемых положительны, результат тоже положительный, причем может оказаться и больше максимально представимого - 2й"1-1. Так как для положительных чи- сел прямой и дополнительный коды совпадают, z* = хпр + упр. Здесь возможны два варианта. 1.1. Если z* < 2й"1, то сп_!=0 (а сп тем более), следова- тельно, z* удовлетворяет формальным требованиям прямого кода для положительных чисел. Поэтому z‘= znp. А так как дополнительный код положительных чисел совпадает с их прямым кодом, то z*= гдоп. 1.2. Если z* ) 2й’1, то его прямой код не может быть разме- щен в ячейке из п битов, следовательно должно быть зафиксировано переполнение. Так как х и у меньше 2n-1, z* < 2П. Поэтому сп = О, а сп -1 = 1 • 57
Случай 2 (х > О, у < 0). Сумма может быть как положительной, так и отрицательной. Результат всегда представим в ячейке, т.е. лежит в диапазоне: -2й'1 с z < 2п-1-1. При сложении кодов получим Z “Хдоп+ Удоп=Хпр + 2п-|уПр|= 2П+ (ХПр~ |уПр I )= 2n + Znp. 2.1. Если znp)0, то znp = гдоп . В то же время za > 2П. Сле- довательно, сп = 1, но гдоп может быть получено из za отбрасыванием сп. Поскольку znp С 2n-1 -1 , cn_i=0. 2.2. Если znp< 0, то za = 2n - lznpI , что по определению является дополнительным кодом z. То есть г* = гдоп Так как |znp| < 2П-1, то za ) 2П-1 , то оказывается, что cn=0, a cn_i=l. Случай 3 (х < 0, у < О). Z* =хДоп+ Удоп=2п-|хпр |+2п-|упр |= 2п + {2п-(|хпр | + |упр 1)1 3.1. Если Iхпр|+|упр|< 2"’1, то прямой n-битный код суммы существует и |znp| = |хпр| + |упр|, a z‘ = 2n+(2n-|znpI). Следова- тельно z‘= 2n + zAon , cn=l, %-!=! и гдоп может быть получено из z* отбрасыванием сп. 3.2. Если Iхпр | +1 упр | > 211’1 должно фиксироваться переполне- ние. При этом оказывается, так как |хпр1+|упрI < 2П, что сп=1, сп_ 1 =0. Подводя итоги полученным результатам, констатируем, что во всех случаях реализуется одна из трех возможностей: 1. Сумма дополнительных кодов является дополнительным кодом суммы, т.е. гдоп = za . 2. Дополнительный код суммы получается из суммы дополнитель- ных кодов отбрасыванием сп, т.е. гдоп = za - 2П. 3. Дополнительный код суммы не может быть получен, так как сумма выходит за диапазон представимых чисел, должно быть зафик- сировано переполнение. Переполнение легко обнаружить по противоречию: если сумма положительных чисел имеет признак отрицательного числа (0^ = 1) или сумма отрицательных чисел - признак положительного (0^ = 0), 58
то имеет место переполнение. Таблица показывает, как нужно интер- претировать результат в зависимости от значения его двух крайних левых бит сп и сп_! и знаковых бит слагаемых ап_! и bn_j Сп • сп - 1 ап - 1 ’ 0,0 0, 1 1,0 1,1 х>0,у>0 0,0 Z4 0n = Z Переп. X X х>0, у<0 0, 1 X Z Д 0 П =Z ZAOn=Z “2П X х<0,у<0 1,1 X X Переп. ZflOn=Z Крест означает, что такое сочетание сп и с^ при данных an_i и bn_i невозможно. Таким образом, общее правило вычисления суммы в дополнитель- ном коде: 1. Вычислить сумму дополнительных кодов слагаемых. 2. Если знаки слагаемых одинаковы, а левые биты результата (сп и Cn-i) различны, то фиксировать переполнение. 3. В противном случае в качестве результата взять п младших битов суммы. Очевидно, что этот алгоритм проще, чем алгоритм сложения в прямом коде. Иногда признак переполнения формулируют иначе. Сложение беззнаковых чисел фактически выполняется в два эта- па: на первом одноименные разряды складываются с формированием единиц переноса, на втором прибавляются единицы переноса. Так вот, число переносов подсчитывается. Правда, не всех, а только число переносов в n-1-й и в n-й разряды. Очевидно, что это число может быть 0,1 или 2. По нашей таблице нетрудно установить, что при нечетном числе переносов переполнения нет, а при четном - есть. Примеры (Для ячейки из 8 битов. Обычно целые со знаком за- писываются в ячейке из 16 битов или более, но для примеров удоб- нее короткие ячейки ) 59
Случай 1 1) х = 111011 у = 10011 00111011 хпр =00111011 упр =00010011 * 00010011 Хдоп=00111011 удоп=00010011 — Tan-i=0 тьп-1=о Z* = 01001110 Тсп-1=0 Переполнения нет, гдоп = Z* = 01001110. 2) х = 111011 у = 1010011 00111011 хпр =00111011 упр =00010011 * 01010011 Хдоп=00111011 удо„=00010011 Тап_1=0 Tbn-,-0 Z* = 10001110 Тсп-1=1 Переполнение. 3) х = 1111111 у = 1111111 01111111 хпр =01111111 УПр =01111111 * 01111111 ХдОП=01111111 удоп=01111111 — Тап-! Tbn-i z* = 11111110 ТСП- 1 Переполнение. Даже при самых больших х и у сп= 0. Случай 2 1) х = -111011 у = 10011 11000101 хпр =10111011 Упр =00010011 * 00010011 Хдоп=11000101 удоп=00010011 — Тап_ 1 Tbn_t Z* = 11011000 ТСП- 1 Переполнения нет, гдоп = Z* = 11011000. znp = 10101000, Z = -101000. 2) х = 111011 у = -10011 00111011 хпр =00111011 упр =10010011 * 11101101 хдоп=00111011 удоп=11101101 — Тап-1 Tbn-i Z* =100101000 Т^п - 1 Переполнения нет, гдоп = Z* - 2е = 00101000. ^пр=2доп» 2 = 101000. Конечно, вычитания 28 е ! машине не производится,- просто отбрасы- вается cn. 60
Случай 3 1) х = -111011 хпр =10111011 Хдоп=11000101 Tan-i Переполнения нет, гдоп z = - 1001110. У = -10011 Упр =10010011 УдОП=11101101 Tbn-1 = Z* - 28 = 10110010. 11000101 * 11101101 Z* =110110010 Т^п -1 Znp = 11001110 2) X = -111011 Хпр =10111011 хдоп=11000101 Тап_!=0 у =-1010011 упр =11010011 удоп=10101101 Tbn-i=o 11000101 + 10101101 Z* =101110010 ТСП- 1 Переполнение. 2.4. Умножение и деление целых чисел К сожалению, нет простых способов выполнять умножение и де- ление в дополнительном коде, и в компьютерах эти операции выпол- няются в прямом коде. Поэтому, если числа хранятся в памяти в до- полнительном коде, их перед умножением и делением надо перевести в прямой код, а после выполнения операции результат перевести из прямого кода в дополнительный для последующего хранения. Конечно, это усложняет выполнение операций умножения и деления. Однако вы- игрыш от применения дополнительного кода в операциях сложения и вычитания перевешивает. Итак, умножение выполняется по следующей схеме: 1. Операнды переводятся в прямой код. 2. Вычисляется модуль произведения как произведение модулей операндов. 3. Вычисляется знак произведения как произведение знаков операндов. 4. Результат переводится в дополнительный код. Иначе, кратко: если хпр= ап_, ап_2 • • • а0, Упр =bn-1 Ьп_2. . . Ьо, то zn р = cn _ i сп _ 2... с0, где сп _ 2.. . Со - ап _ 2.. . а0 х Ьп _ 2. . . Ьо, % -1 ап -1 xbn _ j. При умножении может возникнуть переполнение. Причем про- 61
исходит это значительно чаще, чем при сложении или вычитании. При делении целых получается два результата - частное и ос- таток. Причем остаток имеет знак делимого. Например, 1. 7/2 = 3, ост.= 1; (-7)/2 = -3, ост.= -1; 2. 7/(-2) = -3, ост.= 1; (-7)/(-2) = 3, ост. = -1. Это правило следует из определения: "поделить с остатком" х на у означает найти такие zt и z2, что х= yxzt + z2. Алгоритм деления целых: 1.Операнды переводятся в прямой код. 2.Вычисляются модули частного и остатка.. 3.Вычисляется знак частного как произведение знаков операндов. 4.Остатку приписывается знак делимого. 5.Результаты переводятся в дополнительный код. При делении целых не возникает переполнения, так как если делимое и делитель помещались в ячейках, то частное и остаток по- местятся тем более. У частного знаков не больше, чем у делимого, а у остатка - не больше, чем у делителя. Правда, здесь имеется своя проблема: ноль относится к целым числам, а деление на ноль невозможно. Поэтому при попытке деления на ноль возникает ситуа- ция, подобная переполнению. 2.5.Арифметический сдвиг Арифметический сдвиг похож на логический. Отличие состоит в том, что знаковый бит здесь рассматривается самостоятельно, т.е. его участие в операции иное, чем других битов. При сдвиге влево (обозначение SAL) знаковый бит остается на месте, а остальная часть ячейки сдвигается так же, как при логи- ческом сдвиге и" । ~i—1 । । — — — — — । । i 'i ii 4- 1- «- <- О " 1 111 ====== 1 » 1 II предпоследний бит теряется знаковый бит сохраняется 62
То 'есть, если х = йп-^-г^-з • • . то после сдвига получим otn-iOn-з • • • Оо0- Если 1х|<2п-2, то арифметический сдвиг влево эк- вивалентен умножению на 2. Например,число 7 в ячейке из восьми битов имеет вид 00000111. После арифметического сдвига влево получим 00001110, что соответствует десятичному 14. Число -7 имеет вид 11111001 в дополнительном коде. После сдвига получим 11110010, что соответс- твует десятичному -14. Если же |х|)2п-2, то происходит потеря старшей значащей циф- ры и результат не равен 2х. Переполнения в этой операции не фик- сируется. В арифметическом сдвиге вправо (SAR) участвуют все биты, но знаковый бит не меняется (при логическом сдвиге в него записыва- ется 0) знаковый бит "размножается" знаковый бит сохраняется Таким образом, если х=ап_1ап_2...а0, то после сдвига получим • • ai • Этот сдвиг эквивалентен делению на 2. Если число без остатка на 2 не делится (oq, =1), то получается (х-1)/2. Например, код числа 7 - 00000111, сдвинутый вправо дает 00000011 - число 3. Код числа -7 - 11111001,- дает 11111100 - число -4. В некоторых машинах имеются операции арифметического сдвига с параметром SALk и SARk - сразу на И битов. Умножение на различные степени двойки (положительные или от- рицательные) выполняется во всех компьютерах намного быстрее с помощью арифметического сдвига, чем обычным путем. $3. Арифметика с плавающей точкой В этом параграфе рассматриваются операции вида z = х*у ( * - это +,-,х или /), а также z=/x , где х, у и z - числа с плавающей 63
точкой, представленные в ячейках в виде троек бх,Пх,тх; бу,Пу,ту; 6z,nz,m2. При этом в ячейке из п разрядов один отведен под код знака числа б, он же - код знака мантиссы (мантисса записывается в дополнительном коде), к разрядов - под машинный порядок П, г разрядов - под машинный код мантиссы ш. Истинный порядок получа- ется из машинного вычитанием смещения р=П-2к-1,а истинная мантис- са - добавлением точки и цифры, стоящей перед точкой. Обычно это О, но иногда - 1 М = О.т или М = 1.т Мы будем рассматривать три варианта интерпретации тройки бх. Пх, тх: 1) х = 2Р хбххО.тх; 2) х = 16р хбххО.тх; 3) х = 2Р хбхх1.тх. Биты мантисс тх,ту и mz будем обозначать через aJf и Kj соответственно. 3.1. Сложение и вычитание Эти операции выполняются в три этапа: 1. Выравнивание порядков. 2. Сложение (вычитание ) мантисс. 3. Нормализация результата. Пусть слагаемые имеют вид х = 2Р хбххО.тх и у = 2Р хбухО.ту. Если окажется, что рх= ру, то первый этап пропускается. В этом случае сумму можно представить в виде z = 2р*х(бхх0.шх + бухО.ту). Выражение, стоящее в скобках, вычисляется как сумма чисел с фиксированной точкой. В результате получим z = 2Рх х | Mz I x6z. 64
Это и есть второй этап. Так как слагаемые по модулю меньше 1 и могут иметь разные знаки, возможны три случая: a) K|MZ |<2 , Ь) 1/2 <|MZ |<1 , с) |MZ |< 1/2 . Для каждого из них третий этап выполняется по своему. Самый простой случай - Ь): мантисса получилась нормализова- ной, IMz | имеет вид ОЛ-Л-г-• • К-г- а код мантиссы результата mz = К-Л-г-К-г- Третьего этапа не требуется и pz = рх, следова- тельно, nz = Пх. В случае а) мантисса имеет вид |MZ|= 1. К-Л-2 • • • К-г • Требуется нормализация вправо - полученная сумма мантисс должна быть сдвинута на один бит вправо. Одновременно порядок ре- зультата увеличивается на 1. То есть выполняется преобразование I z I =2Р* *1 х | Mz t | , где |MZ1 l = |Mz |/2 . Теперь I Mz j I = 0. IK-! К-2 • • • К-г » а nz= Пх + 1 . Окончательно mz получается из |MZ1| отбрасыванием знаков "О" и и К_г, не умещающегося в разрядную сетку: mz=lY_ Л-2 •.Л-г+i• В случае с) требуется нормализация влево, причем количество бит, на которые следует сдвинуть мантиссу, может быть различным. Если 1/4 С |MzI < 1/2, то оно равно 1, если 1/8 С |MZ| < 1/4, то 2. В общем случае, при 2"1-1 ( |MZ| < 2'1 требуется сдвиг на 1 бит (очевидно столько нулей после запятой подряд имеет чис- ло |М2|): |MZ I = 0.00. ...OI-j.Л-1-2... К-г- Н 1 -I Одновременно на 1 увеличивается порядок. В результате |z| = 2РХ-1 x|Mz21. где |MZ21 = О.Щ-Лч-г-.-К-г Теперь результат нормализован, следовательно mz = К-1 -1 К-1-2 • • • К-г00. ... О, nz = Пх 1. I- 1 -I 65
Вернемся к первому этапу. Пусть Пх > Пу. Тогда на первом этапе выполняется денормализация числа у за счет сдвига мантиссы вправо и соответствующего увеличения порядка. Величина сдвига равна разности Пх - Пу. Получаем lyI = 2₽хх|Му1 I . где |Му1 |= 0.00.... OP-h-jP-h-z- Pr . h = Пх - Пу. I- h -I Порядки слагаемых выравниваются и теперь можно выполнять второй этап так, как он описан. Если Пх < Пу, то аналогично преобразует- ся х. Кратко алгоритм сложения можно записать так. Этап 1. Выравнивание порядков. 1. Если Пх = Пу, то перейти к этапу 2. 2. Если Пх > Пу. то |МУ |: = 0.00.... OP-b-jP-h-z.. .рг К h -I (h = Пх - Пу), Пу:= Пх и перейти к этапу 2. 3. Если Пх < Пу. то |МХ|:= 0.00.... ОвСц^О-п-г •. От I- h -I (h = Пу - Пх), Пх:= Пу. Этап 2. Сложение мантисс. М2: = Мх + Му Этап 3. Нормализация. 1. Если |MZ I = 0.1Ц.2- • Л-г- то т2: = Л-г- • Л-г- П2: = Пх. Конец. 2. Если |М21 = 1.7. Л-г- - Л-г. то т2:= Л-Л-г-• Л-r+i- П2: = Пх+1. Конец. 3. Если |М21 = 0.00. ...Oll-j-z.. Л-г . К 1 -I то mz: = Л-1-2-• Л-г00- • • -°- П2:0- Пх-1. Конец. I- 1 -I В случае, если в машине принято представление вида х = 16Рх хбххО.шх , у = 16₽х хбухО. шу , 66
нормализация и денормализация могут выполняться только на тетра- ды. Описанный выше алгоритм сложения можно перенести и на этот случай, считая в нем всюду нули, единицы, и lt шестнадца- теричными цифрами. Конечно, одновременно г надо заменить на г/4 или ближайшим к г/4 целым, большим, чем г/4 (число тетрад в 4 ра- за меньше, чем число бит). Заметим, что некоторые машины имеют разновидности команд сложения и вычитания с блокировкой нормализации.Точнее их следо- вало бы называть с блокировкой нормализации влево, так как норма- лизация вправо заблокирована быть не может. Если используется третий вариант представления х = 2Рх x6xxl. щх и у = 2Pj,x6yxl.my . то сложение выполняется по схожему алгоритму. Этап 1. Выравнивание -порядков. 1. Если Пх = Пу, то перейти к этапу 2. 2. Если Пх > Пу, то |МУ|:= 0.00.... 010.^! |kh.2... 0Г l-h-1-l (h = Пх - Пу), Пу:= Пх и перейти к этапу 2. 3. Если Пх < Пу. то |МХ |: = 0. 00.. .. 01a.h.ta.h.2...ar l-h-l-l (h = Пу - Пх), Пх: = Пу. Этап 2. Сложение мантисс. Mz:= Мх + Му Этап 3. Нормализация. 1. Если |MZ |=1Л-Л-г- • Л-г- то mz:=l-iI-2-•Л-г. Пг:=Пх. 2. Если |MZ |=11о Л-Л-г-• Л-г • то mz:= КоГЛ-г-• Л-г*1 • П2:= Пх+1. 3. Если |М2 I = 0.00... .011.1-2-• Л-г • I- 1 -I то mz: = 1-! _2. • Л.г00.... 0. nz:=nx-i-l. I-1+1-I Так как при таком представлении числа всегда должны быть нормализованы, блокировка нормализации здесь невозможна. Замечания. l.Bo всех вариантах алгоритма на третьем этапе может потре- 67
боваться нормализация вправо. При этом порядок результата увели- чивается на единицу. Если порядок хотя бы одного из слагаемых уже был равен максимальному для данного представления, то наступает переполнение. При этом правильный порядок записан быть не может. 2.Во всех трех вариантах при х=-у получается Mz=0. В этом случае формальный признак - нуль в первом бите после точки требу- ет нормализации влево. Однако нормализация выполнена быть не мо- жет и в ячейку результата записывается тройка 62,Пх,0 (6Z может оказаться любым). В машинах с обязательной нормализацией этот случай называют антипереполнением или потерей значимости. Для них это не истинный нуль (истинный нуль - при nz=0). З.При нормализации влево может возникнуть такая ситуация: |М2 I = 0.00... .01Г1-2- • Л-г . Пх<1 . I- 1 -I Так как nz не может быть отрицательным, полная нормализация результата невозможна. Выполняется лишь частичная нормализация, т.е. мантисса сдвигается влево на Пх бит и в качестве результата принимается mz = 00.....OIK.^2 Y_r00. ...О , nz = 0. М-Пх-| I- Пх-| В машинах, не допускающих работу с ненормализованными числами, такое число считается нулем (так как nz=0). При этом ненормализо- ванность мантиссы не считается антипереполнением, так как в любых последующих операциях эта мантисса не будет использоваться. 3.2. Умножение В общем виде алгоритм умножения можно записать так: 1. Сложение порядков. 2. Перемножение мантисс. 3. Определение знака. 4. Нормализация результата, если необходимо. Действительно, перемножая х = Sp*xMx и у = SPyxMy, получим z=SPx +рхх(МххМу). 68
Если 1/2 <|МХ|< 1, 1/2 <|Му|< 1 ( при S=2 ), то для |Мхх МуI может потребоваться нормализация влево, но не более, чем на один бит, так как 1/4 <|Мхх Му|< 1. Если 1/16 <|Мх|< 1, 1/16 <IМу|< 1 ( при S=16 ), то для |Мхх МуI может потребоваться нормализация влево, но не более, чем на одну тетраду, так как 1/256 <|Мхх му|< 1. В случае 1 <|МХ|< 2, 1 СIМуI< 2 ( S=2 ) может потребовать- ся нормализация вправо, но не более, чем на один бит, так как 1 С|МХ х Му|< 4. Краткая запись алгоритма умножения 1. flz: =Пх+Пу-2к'1 (подразумевается, к бит); 2. |MZ|:= |МХ|х|Му|; 3. 6Z: =(бх+ бу )mocl2; 4. а) для машин с |М|<1. Если |MZ| = 0.1Y-2Y-3-•• Y-q» то mz:=1К-2Y-з••• Y-q, иначе- (если |MZ |= 0.01_2К_з.. . l(_q) mz • =Y-2Y-з• • • Y-q 0» nz.=nz-l. (Если S=2, to q=r - числу бит в мантиссе, а - двоичные цифры, если S=16, то q =г/4, a Yi - шестнадцатеричные.) что порядок записывается в Ь) для машин с |М1<2. Если |MZ| = l.Y-iY-2-•• Y-г. то mz:= К-Л-г-• • Y-q> иначе (если |MZ|:=1YoY-i•••Y-r + i)• mz: = Yo Y-1 • • • Y- r +1 • nz:=nz+l. Замечания. 1. В первом пункте алгоритма 2k-1 вычитается, чтобы получить машинный порядок произведения. 2. Переполнение возникает, если в итоге порядок больше пре- дельно допустимого: nz>2k. 3. Может оказаться, что nz<0. Тогда записывается nz=0 - ма- шинный нуль. 69
3.3. Деление Алгоритм деления аналогичен алгоритму умножения: 1. Вычитание порядков. 2. Деление мантисс. 3. Определение знака. 4. Нормализация результата, если необходимо. Очевидно, z = Sp "р хМх/Му. Если в машине требуется, чтобы было 1/2 с|М|< 1, то получим 1/2< |Мх/Му|< 2 т.е. может потребоваться нормализация вправо на один бит (но не более). Если в машине 1/16<|М|< 1, то получим 1/16<|Мх/Му|< 16. т.е. может потребоваться нормализация вправо на одну тетраду ( но не более). Если же в машине 1<|М|<2, то 1/2 <|МХ/МУ|< 2. то есть может потребоваться нормализация влево на один бит (но не более). Краткая запись алгоритма деления. 1. П2: =ПХ-ПУ+2к-1; 2. |MZ |: = |МХ/МУ I; 3. б2: =(6х+бу )mod2; 4. а) для машин с |М|<1. Если |MZ | " 0. 17-21-3- • • 7-q. то mz; =17-г7-з••• 7-q. иначе- (если |MZ |=1.7-17-г7-з- • -7-q) mz:=17-i7-27-3--- 7-q.i- nz:=nz + l. (Если S=2, to q=r - числу бит в мантиссе, а - двоичные цифры, если S=16, то q=r/4, а 1, - шестнадцатерич- ные. ) Ь) для машин с 1М1<2. Если |MZ |= 1-7-17-2-•• 7-г. то mz: =7-17-2 - - - 7-q> иначе - (если |MZ|:= 0.17-2-.- 7-г>- mz:= 7-2-•• l-r®’ nz.=nz-l. 70
Замечания. 1. При nz > 2к возникает переполнение. 2. При П2< 0 возникает антипереполнение. При этом принимает- ся nz= 0. 3. Если Пу= 0 или Му= 0 операция не производится и считает- ся, что произошло переполнение. 3.4. Квадратный корень В некоторых машинах операция извлечения квадратного корня включается в число элементарных, в других - выполняется специаль- ной программой. Пусть x=SPx хМх. Будем опираться на очевидный факт: если 1/4 < Мх< 1, то 1/2 < |/РГх < 1 , если 1/256 < Мх< 1, то 1/16 < < 1 , если 1 < Мх< 4, то 1 С |/ЯГх < 2 . Для рх четных будем вычислять у=/х" так: у= sPx72 х |/мх. При этом, если мантисса х была нормализована, то в любом случае ^/Мх будет нормализован и следует принять ру=рх/2, Му=/Мх. Для рх нечетных надо выполнить преобразование: при Мх< 1 ( S=2 или 16 ) - x=Sp**1 х(Мх/S), при Мх< 2 ( S=2 ) - Х=2Р*"1 х(2Мх ) Теперь можно принять ру = (рх + 1)/2 , My=/fi~x/S в первом и ру = (рх-1)/2 , МУ=|/2МХ во втором случае. Краткая запись алгоритма. 1. Если Пх - четное, то Пу:=Пх/2 + 2к-2 (вспомним, что р=П-2к"1), Му : =|/fi^ . 2. Если Пх - нечетное, то а) Пу:=(Пх+1)/2 + 2к’2, Му:= |/^_/S при М<1, Ь) Пу:=(Пх-1)/2 + 2к‘2, Му: = |/2Мх при М<2. Замечания 1. Переполнения при выполнении этой операции не возникает, так как /х < х при х > 1. 2. Разумеется должно быть Мх>0. В противном случае операция невыполнима и ситуация приравнивается к переполнению. 71
3.5. Области применимости арифметических операций Будем каждой паре чисел, участвующих в арифметической опера- ции, ставить в соответствие точку на плоскости с координатами х и у. Если, например, складываются или перемножаются числа 2 и 3, то эта паре будет соответствовать точка, отмеченная на рис. 2: Очевидно, что множеству всех пар чисел, которые могут уча- ствовать в машинных арифметических операциях, соответствуют точ- ки, располагающиеся в квадрате размером 2xmaxx 2утах. Так как хтах = Утах • на рис. 3 они обозначены одинаково - через М. Если быть точным, из квадрата следует изъять точки, принадлежащие по- лоскам шириной 2xtnln. заштрихованным на рисунке. Однако, они столь узки, что при соблюдении масштаба будут неотличимы от осей координат. В дальнейшем мы о них вспоминать не будем. У ТМ 0 2 -М Рис. 2. Рис.З. Очевидно, что не все пары чисел из квадрата могут участво- вать в машинной операции сложения. Пара х=М-1 и у=М-2, например, принадлежит квадрату, но ее сумма - z=2M-3 - число, превышающее максимально допустимое в машине. Из неравенства z=x+y С М получим у < М - х, а из z ) -М получим у >-М -х. Эти неравенства разбива- ют квадрат на три области (рис.4). Заштрихованы области, содержащие те пары чисел, сложение ко- торых вызывает переполнение (области переполнения). В остальной части квадрата сложение возможно. Особо выделена прямая, точки которой приводят к антипереполнению. 72
Аналогично выглядит рисунок для вычитания (рис.5) Числа, которые можно перемножать, должны удовлетворять нера- венству -М < хху < м, откуда для первого квадранта (х>0, у>0) по- лучаем у < М/х. Если же |хху| < т, где т - минимальное число, от- личное от нуля, то в первом квадранте для всех у < m/х процессор будет выдавать z = 0. На рис.6 изображено разбиение квадрата допустимых сомножите- лей. Редкой штриховкой отмечены области переполнения, частой - области, где результат - машинный нуль. Кривые на рисунке выпол- нены не в масштабе. Точки а и А, лежащие на диагонали квадрата, должны иметь координаты ха= уа= |/гп и хА= уА = |/М~ соответственно. Если, например, М=263, ат=2'63, то /М~1.4х231, а |/т~1.4х2"32. Т.е. если взять М равным 3000 километров, то при соблюдении масштаба, получится равным примерно 1 миллиметру. Из неравенств Iх/уI<М и Iх/уI<т получаем области переполне- ния и машинного нуля для операций деления (рис.7). Штриховка здесь имеет тот же смысл, что и на рис.6. Точка А имеет координа- ты М и 1, а точка а - тхМ и М. Для машин, в которых мантисса больше единицы, тхм=1, для тех, где мантисса меньше единицы, mxM=S’2 (т.е. 1/4 при S=2 и 1/256 при S=16). Как видно из рисунков, в делении могут участвовать почти все пары чисел, представимых в памяти компьютера, в сложении и вычитании - 3/4 всех пар. В умножении, не вызывая пере- полнения, может участвовать лишь небольшая часть пар. Соответ- 73
ствующие доли равны отношению незаштрихованных площадей к всей площади квадрата. Для умножения эта доля будет м (1/M2) (M/x)dx = InM/M что при М = 263 составляет чуть меньше 2"55 % ! Рис. 7 $4. Десятичная арифметика В большинстве машин имеются команды сложения и вычитания де- сятичных чисел, записанных в двоично-десятичном коде (BDC). Оче- видно, что без них можно обойтись - числа можно перевести в дво- ичную систему, в ней выполнить операцию, а затем перевести ре- зультат в десятичную систему. Получается, что возможны два спосо- ба организации вычислений: 1. С помощью команд десятичной арифметики исходные данные в BDC —► переработка командами десятичной арифметики конечные ре- зультаты в BDC 74
2. Без команд десятичной арифметики. Хотя десятичные операции сложения и вычитания выполняются дольше, чем двоичные, перевод из десятичной системы в двоичную и обратно выполняется еще дольше. Следовательно, если числа вводят- ся в память в основном для хранения и лишь изредка складываются или вычитаются, то выгоднее операции выполнять в десятичной сис- теме. Это можно выразить соотношением ^х^двоичн . > Ц 0-*2 +^х^десятичн . + 0 » где tAB0H4H и Ьдесяти4Н - время выполнения процессором одной дво- ичной операции и одной десятичной, t2 10 и t10 2 “ время, необхо- димое процессору для перевода одного числа из двоичной системы в десятичную и обратно, v - среднее число арифметических операций, выполняемых процессором на каждое вводимое число, g - среднее ко- личество выводимых чисел, приходящееся на одно вводимое число. Если это соотношение выполнено, то лучше воспользоваться операци- ями десятичной арифметики. Операции с десятичными числами основаны на следующих фактах: а) если шестнадцатеричное число х не превосходит 9, . то оно совпадает с десятичным; Ь) если шестнадцатеричное х лежит в диапазоне А <х< 1316, то десятичное х можно получить с помощью процедуры х10 := х16+6. ( В этой формуле справа выполняются вычисления в шестнадца- теричной системе, результат - шестнадцатеричное число, однако оно неотличимо от десятичного и десятичным объявляется.) На- пример 75
xi 6= 4i 6 "* xi q : = 4 Х16= В16 -* В+6=1116 -* х! 0 1=1110 х1б = 121б 12i6+6=1816 “* xi0 :=1810 Операции сложения и вычитания десятичных чисел выполняются поразрядно с парами цифр справа налево. При сложении возможен пе- ренос единицы в старший разряд, а при вычитании - заем из старше- го разряда. Так как числа записаны в двоично-десятичном коде, где десятичные цифры изображаются тетрадами, поразрядность выполнения операций означает, что они выполняются над тетрадами. Если быть точным, операции выполняются над двоичными беззна- ковыми числами и переносы и заемы могут возникать не только между тетрадами, но и между любыми разрядами чисел. Однако переносы внутри тетрад являются частью операций с тетрадами, и лишь пере- носы в пятый и девятый разряды определяют взаимодействие тетрад. Сложение и вычитание выполняются с каждой парой тетрад в два этапа. На первом - тетрады складываются (вычитаются) как шестнад- цатеричные числа. Так как результат получается шестнадцатеричным, на втором этапе он переводится в десятичную систему. Этот этап называют десятичной коррекцией. Коррекция при сложении производится, если в результате вы- полнения первого этапа произошел перенос единицы в следующую тет- раду или полученная тетрада не может быть интерпретирована как десятичная цифра. Заключается коррекция в прибавлении к тетраде результата числа 6. При вычитании коррекция производится, если был сделан заем единицы, и заключается в вычитании числа 6 из тетрады результата. Примеры. 1. 12+19=31 двоично-десятичные 1-й этап 2-й этап коды 12=000100102/!о 00010010 00101011 19=000110012/j о 4 00011001 4 ОНО 31=001Ю0012/10 00101011 00110001 I недопустимая комбинация 76
2. 38+49=87 двоично-десятичные коды 38=001110002/jо 49=O1OO1OO12/Io 87=100001112/jо 1-й этап 2-й этап 00111000 10000001 *01001001 * ОНО 10000001 10000111 т произошел перенос в старшую тетраду 3. 28+11=39 двоично-десятичные коды 28=001010002/10 11=000Ю0012/10 39=001110012/J0 4. 54-29=25 двоично-десятичные коды 54=О1О1О1ОО2/jо 29=001010012 Х10 25=001001012/J0 5. 95-43=52 двоично-десятичные коды 95=1ОО1О1О12/1О 43=010000112/10 52=010100102 Х10 1-й этап 2-й этап 00101000 недопустимой комбинации *00010001 или переноса нет - вто- 00111001 рого этапа не требуется 1-й этап _ 2-й этап 01010100 00101011 ~ 00101001 ОНО 00101011 00100101 т произошел заем из старшей тетрады 1-й этап 2-й этап 10010101 заема не было - кор- *01000011 рекции не требуется 01010010 В некоторых компьютерах десятичные сложение и вычитание реа- лизованы аппаратно, т.е. выполняются одной командой. В других та- ких операций нет. но процессор предоставляет программисту специ- альные средства для реализации этих операций программно, т.е. несколькими командами. Такими средствами являются признаки переноса в девятый и в пятый разряды, которые вырабатываются процессором при выполнении 77
двоичного сложения и признаки заема из девятого и пятого разря- дов,- при вычитании. Для запоминания этих признаков процессор имеет специальные одноразрядные регистры. Имеется также несколько специальных команд. Это команды: коррекция после сложения, кор- рекция после вычитания, сложение с переносом, вычитание с заемом. Первые две команды используются после команд сложения и вы- читания соответственно. Они выполняют второй этап десятичной арифметики сразу с двумя тетрадами, входящими в байт. Вот как это происходит, например, при сложении. 1. По содержимому левой тетрады байта результата и признаку переноса в девятый разряд устанавливается необходимость в коррек- ции левого байта. 2. По содержимому правой тетрады байта результата и признаку переноса в пятый разряд устанавливается необходимость в коррекции правого байта. 3. При необходимости коррекции к байту результата прибавля- ется число 01100000, или 00000110, или 01100110. Часто десятичные числа занимают больше одного байта. В этом случае байты складываются справа налево. 1. Складываются правые байты, выполняется десятичная коррек- ция. 2. Все последующие байты складываются с использованием опе- рации сложение с переносом. Эта операция складывает байты и к сумме прибавляет единицу, если предыдущая операция выработала бит переноса. Аналогично выполняется десятичное вычитание байтов и нес- кольких байтов.
ОГЛАВЛЕНИЕ Введение. УСТРОЙСТВО И РАБОТА ЭВМ. ПЕРВОЕ ПРИБЛИЖЕНИЕ........ 3 Глава 1. ПРЕДСТАВЛЕНИЕ ДАННЫХ В КОМПЬЮТЕРЕ..................... 6 §1 .Системы счисления............................... l.l. P-ичная система счисления................... 1.2. Правило перевода из одной системы счисления в другую.................................. 9 1.3. Двоичная и вспомогательные системы........... 14 1.4. Другие системы счисления..................... 19 §2 . Представление двоичных чисел.................... 23 2.1. Целые....................................... 2. 2. Дробные числа............................... 28 2.3. Диапазон и точность.......................... 32 §3 . Представление текстов........................... 39 3.1. Кодирование символов........................ 3. 2. Кодирование десятичных чисел................ 41 3.3. Битовые строки............................... 42 Глава 2. КОМПЬЮТЕРНЫЕ ВЫЧИСЛЕНИЯ.............................. 43 §1 . Операции с битовыми строками................... 1.1. Логические сдвиги........................... 1.2. Операции математической логики............... 45 1.3. Маски........................................ 48 §2 . Арифметика целых................................ 51 2.1. Операции с беззнаковыми числами.............. 53 2. 2.Сложение и вычитание целых в прямом коде. Сравнение и признаки результата................... 54 2.3. Сложение и вычитание в дополнительном коде... 56 2.4. Умножение и деление целых чисел.............. 61 2. 5. Арифметический сдвиг........................ 62 §3 . Арифметика с плавающей точкой................... 63 3.1. Сложение и вычитание......................... 64
3. 2. Умножение.................................... 68 3.3. Деление....................................... 78 3.4. Квадратный корень............................ 71 3.5.Области применимости арифметических операций.. 72 §4. Десятичная арифметика............................. 74 Сергей Львович Сергеев КОМПЬЮТЕРНАЯ АРИФМЕТИКА Учебное пособие Зав. редакцией Г. Чередниченко Редактор М. Юдович Лицензия ЛР 020351 от 27.12.1991 г. Подписано в печать с оригинала-макета 20.12.95. Ф-т 60X90/16. Печать офсетная. Усл.печ.л.5. Уч.-изд. л. 4,86. Тираж 300’экз. Заказ 98 Редакция оперативной подготовки учебно-методических и научных изданий Издательства Санкт-Петербургского университета. 199034, Санкт-Петербург, Университетская наб., 7/9. Центр оперативной полиграфии Санкт-Петербургского университета. 199034, Санкт-Петербург, наб. Макарова, 6.