Echo
#03
31 марта 1997 |
|
Книга - Тайники ZX-Spectrum: Компьютерная арифметика.
Глава 4. К О М П Ь Ю Т Е Р Н А Я А Р И Ф М Е Т И К А Единичная ячейка памяти компьютеров, сделанных на процессоре Z80, размещает в себе одно слово (байт), состоящее из 8-ми цифр, каждая из которых может быть либо 0, либо 1. Переход от двоичного представления к десятичному очень прост. Выпишем в ряд по очереди числа 2^7, 2^6,..., 2^1, 2^0. Затем, под каждым из этих чисел выпишем одну цифру двоичного представления. Скла- дывая между собой только те числа верхнего ряда, под которыми оказались единицы, по- лучим десятичное значение. Например, дво- ичное число 01001101: 128 64 32 16 8 4 2 1 0 1 0 0 1 1 0 1 ----------------------- 64 8 4 1 =77 Содержимым ячейки памяти (байта) может быть положительное число в диапазоне 0... 255. Иногда выгодней рассматривать эти числа как значения со знаком. Самый старший раз- ряд (самый левый бит) определяет знак 0, если +; 1, если -. При такой интерпретации мы имеем числа в диапазоне -128... 127. Однако, компьютер всегда выполняет действия лишь над натуральными числами без знака. Поэтому в ZX-SPECTRUM для представ- ления чисел применяется код дополнения до двух. Числа, меньшие нуля записываются в нем как 256+K. Например, число -7 представляется как 256-7=249. В этой сис- теме самый старший бит интерпретируется как знак числа. Поэтому проблем , связан- ных с арифметикой, не существует. Основные арифметические операции ведут к верным ре- зультатам независимо от выбора способа за- писи чисел. Например, 246+1=247 является очевидным равенством для чисел без знака, но также является верным равенством, если считать 246 как -7, так как тогда 247=256+(-6) обозначает -6. Использование таких маленьких чисел не- достаточно, поэтому большие числа необхо- димо хранить в нескольких байтах, следую- щих один за другим. В ZX-SPECTRUM важную роль играют 16-значные числа (16 бит). Их цифры делятся на 2 группы по 8 бит. Левый байт называется старшим, а правый младшим. Во всех компьютерах, организованных на Z80, принято правило, что если два очеред- ных байта с адресами X, X+1 содержат како- е-либо число, то под адресом X размещается младший байт, а в X+1 - старший. Чтобы оп- ределить какое число содержат эти ячейки, необходимо старший байт умножить на 256 и прибавить младший. Если это должно быть отрицательное число, представленное в коде дополнения до двух, то еще отнимем 2^16=65536. Эти 16-битовые числа позволяют хранить числа в диапазоне 0.. 65535 (беззнаковые) или -32728... 32727 (знако- вые). При программировании в машинном коде часто возникает необходимость выполнения разных операций над битами. Использование десятичного представления при этом затруд- нительно, а двоичного слишком громоздко. Поэтому наиболее удобным является 16-ая запись. Для записи 16-ричных чисел (гексо- децимальных) используют числа от 0 до 9 и буквы от A до F (10 - это A, 11 B, 12 - C, 13 - D, 14 - E, 15 - F). Пересчет 16-ричного представления в 10-ичное нетруден. Правило: умножать оче- редную цифру на очередную степень числа 16 и складывать произведения. Например, 16-ричное число FFFF представляется в ви- де: 15*16^3+15*16^2+15*16^1+15*16^0=15*4096+ +15*256+15*16+15=65535 Переход от двоичной формы к 16-ричной и обратно особенно прост. Делим цифры бинар- ного числа на группы по 4 бита и каждую четверку представляем 16-ричной цифрой. Например, 1001111110 = 0010 0111 1110 = 27E. Как видно, главным преимуществом 16-ричных чисел является простота перехода к двоичному представлению и наоборот, при одновременно высокой плотности записи. Да- лее 16-ричным числам будет предшествовать знак #. Способы кодирования больших чисел и чи- сел с плавающей запятой для различных компьютеров различны. В ZX-Бейсике все числа хранятся в 5-ти последовательных байтах. Целые числа из диапазона -65536... 65535 кодируются иначе, чем остальные. Первый байт в их представлении всегда ра- вен 0. Последний байт положительного числа равен 0, а отрицательного 255. В третьем и четвертом разместятся соответственно млад- ший и старший байты данного числа, причем отрицательные значения хранятся в коде дополнения до 2-х. Например, число 38 выг- лядит так: 0 0 0 38 0, а число 743=2*256+231 имеет вид: 0 0 231 2 0. В свою очередь, число -1231 запишется как 0 255 251 49 0, так как 256*251+49=65536-1231. С остальными числами все запутано еще больше. Используется факт, что каждое чис- ло можно однозначно представить в виде: 2^N*M, где M - число в диапазоне [1/2, 1]. В первом байте ZX-SPECTRUM хранит значение N+128. В остальных 4-х размещено число M в двоичной форме, а точнее M*2^32, с тем, что самый старший бит, который всегда дол- жен быть равен 1, служит для хранения зна- ка числа. Единица означает минус, а нуль - плюс. Допустим, что пять последовательных ячеек памяти содержат числа 130 212 16 34 178. Они интерпретируются как число: -2^(150-128)*(212/2^8+16/2^16+34/2^24+ +178/2^32), а байты 106 112 4 231 78 представляют число: 2^(106-128)*((128+112)/2^8+4/2^16+231/ /2^24+78/2^32). Достоинством языков высокого уровня (в том числе ZX-Бейсика) является то, что программист освобожден от записи представ- ления различных чисел в память.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября