|
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-Бейсика) является то, что
программист освобожден от записи представ-
ления различных чисел в память.
Другие статьи номера:
Похожие статьи:
В этот день... 13 ноября