Кодирование целых чисел без знака в компьютере, арифметические операции.
Будем исходить из того, что для записи числа в устройствах компьютера выделяется фиксированное количество двоичных разрядов. Память компьютера имеет байтовую структуру, однако, размер одной адресуемой ячейки обычно составляет несколько байт. Например, в компьютерах IBM ячейка памяти объединяет 2 байта (16 двоичных разрядов) - такая комбинация связанных соседних ячеек, обрабатываемая совместно, называется машинным словом. Для представления числа в регистре арифметико-логического устройства процессора, где формируется результат операции, имеется еще один дополнительный одноразрядный регистр, который называется регистром переноса и который можно рассматривать в качестве продолжения (т.е. 17-го бита) регистра результата.
Конечный размер разрядной сетки порождает понятие «наибольшее целое
число», которого в обычном (немашинном) представлении чисел просто не существует.
Если количество разрядов k и р = 2, то,
согласно формуле, что ,
. В частности, при к=16:
. Другими словами, целого числа, скажем, 65636 и более
в компьютере просто не может
существовать и, следовательно, появление в ходе
вычислений чисел, превышающих (Z2)
,
должно интерпретироваться как ошибка. Минимальным целым числом в беззнаковом представлении,
очевидно, является
. В языке
программирования PASCAL целые числа без знака, для записи которых отводится 2
байта, определены как тип Word. Тип устанавливает способ кодирования числа,
количество отводимых для записи ячеек памяти (т.е. разрядность числа), а также перечень допустимых
операций при обработке. Выход за границу 65535 возможен только путем увеличения
количества разрядов для записи числа, но это порождает новый тип со своим Z
; например, тип Longint
, числа которого занимают 4 байта.
Рассмотрим, как с беззнаковыми числами выполняются арифметические операции, не меняющие типа числа; очевидно, к ним относятся сложение и умножение.
Сложение производится согласно таблице сложения, которая для двоичных чисел имеет вид:
0+0= 0 0+1=1
1 +0= 1 1 + 1 =10
В последнем случае в том разряде, где находились слагаемые, оказывается 0, а 1 переносится е старший разряд. Место, где сохраняется переносимая в старший разряд 1 до того, как она будет использована в операции, называется битом переноса .
Умножение производится согласно таблице умножения, которая для двоичных чисел имеет предельно простой вид:
0*0 = 0 0 *1 = 0;
1 *0 = 0 1*1 = 1.
Кодирование целых чисел со знаком, прямой код, дополнительный код.
Кодирование
целых чисел, имеющих знак, можно осуществить двумя способами. В первом варианте
один (старший) разряд машинном слове отводится для записи знака числа; при этом
условились
кодировать знак «+» нулем, знак «-» - единицей. Под запись самого числа,
очевидно, остается 15 двоичных разрядов, что обеспечивает наибольшее значение
числа = 3276710. Такое представление
чисел называется прямым кодом. Однако его применение усложняет порядок
обработки чисел; например, операция сложения двух чисел с разными знаками
должна быть заменена операцией вычитания меньшего из большего с последующим присвоением результату
знака большего по модулю числа. Другими словами, операция сопровождается
большим количеством проверок условий и выработкой признаков, в соответствии с которыми
выбирается
то или иное действие.
Альтернативным вариантом является представление чисел со знаком в дополнительном коде. Идея построения дополнительного кода достаточно проста: на оси целых положительных чисел, помещающихся в машинное слово (0 --65535), сместим положение «0» на середину интервала; числа, попадающие в первую половину (0 -32767) будем считать положительными, а числа из второй половины (32768 - 65535) - отрицательными. В этом случае судить о знаке числа можно будет по его величине и в явном виде выделение знака не потребуется. Например, 1000000000000012 = 3276910 является кодом отрицательного числа, а 0000000000000012 = 110 -кодом положительного. Принадлежность к интервалу кодов положительных или отрицательных чисел видна по состоянию старшего бита - у кодов положительных чисел его значение «0», отрицательных - «1». Это напоминает представление со знаком, но не является таковым, поскольку используется другой принцип кодирования. Его применение позволяет заменить вычитание чисел их суммированием в дополнительном коде.
Дополнением (D) k-разрядного целого числа Z в системе счисления р называется величина D(ZP, k) = pk - Z.
Данную формулу можно представить в ином виде: D(ZP, k) = = ((Pk - 1) - Z) + 1. Число - 1 согласно
, состоит из k наибольших в данной системе счисления цифр (р
- 1), например, 999910, FFF16 или 11111112. Поэтому (pk - 1) - Z можно получить путем дополнения до
р-1 каждой цифры числа Z и последующим прибавлением к
последнему разряду 1.
Так как в двоичной системе счисления дополнением 1 является 0, а дополнением 0 является 1, построение D(Z2, k) сводится к инверсии данного числа, т.е. замена нулей единицами и единиц нулями, и прибавлением 1 к последнему разряду. Другими словами, дополнение двоичного числа формируется в два этапа:
• строится инвертированное представление исходного числа;
• к инвертированному представлению прибавляется 1 по правилам двоичной арифметики.
Дополнительный код (DK) двоичных целых чисел строится по следующим правилам:
Ø для Z2 > 0 дополнительный код совпадает с самим число
Ø для Z2 < О дополнительный код совпадает с дополнением модуля числа.
Необходимо уточнить, что при выполнении вычитания отрицательного числа оно из дополнительного кода переводится в прямой, и вновь вместо вычитания производится сложение.
Подобным же образом
число из дополнительного кода переводится в прямой при выполнении операции
умножения; перемножаются всегда положительные числа .Знаковый бит
результата, очевидно, будет содержать 0, если знаки чисел одинаковы, и 1 при
противоположных знаках. Над множеством целых чисел со знаком операция деления не
определена,
поскольку в общем случае ее результатом будет вещественное число. Однако допустимыми являются
операции целочисленного деления и нахождения остатка от целочисленного деления
(те, что обозначены div и mod). Точнее, значения обеих величин
находятся одновременно
в одной процедуре, которая в конечном счете сводится к последовательности вычитаний или, еще
точнее, сложений с дополнительным кодом делителя. Примем обо значения: - делимое;
делитель; L - результат целочисленного деления
на
R- остаток от
целочисленного деления
на
. Эти величины
связаны между собой довольно очевидным соотношением:
,
из которого следует алгоритм нахождения значений L и R для заданных
и
.
Таким образом, операции div и mod, как, впрочем, и операция умножения, реализуются программно, т.е. сводятся к последовательности небольшого числа более простых действий. При этом уровень программной реализации может быть различным. Если реализация выполнена на уровне команд центрального процессора, то эти операции оказываются доступны из любого приложения (любой прикладной программы). Если же в системе команд процессора эти микропрограммы отсутствуют, их приходится описывать в виде процедур в самих приложениях и, следовательно, они будут доступны только в этих приложениях.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.