
Методы / Мышев А.В. (ч.1)
.pdf
ет просматривать число справа налево, сохранить все младшие нули и первую встретившуюся 1, а остальные биты инвертировать.
Пример 1.12. Найти дополнительный код числа -1408 (n=16).
Аналогичные правила (пятое и шестое) справедливы и для перехода от дополнительного кода отрицательного числа к симметричному положительному числу. Поэтому, если исходить из дополнительного кода числа, пятое, шестое и седьмое правила превращаются в правила изменения знака числа. Обычно эта операция имеет мнемоническое обозначение NEG (от negate-изменить знак).
Отметим, что в дополнительном коде
-число ноль имеет единственное представление 00...00;
-максимальное по модулю отрицательное число -2n-1 не имеет симметричного положительного числа, поэтому применительно к нему в операции изменения знака фиксируется особый случай;
-инкремент (увеличение на 1) максимального положительного чис-
ла +( 2n−1 −1) как результат дает 2n-1, т.е. максимальное по модулю отрицательное число, поэтому операция инкремента (и декремента, т.е. уменьшения на 1) применима только к беззнаковым числам.
Очень широкое применение дополнительного кода в современных компьютерах объясняется следующими двумя основными причинами. Во-первых, при сложении дополнительных кодов слагаемых как беззнаковых целых чисел получается дополнительный код суммы (если, конечно, переполнение исключено): XДК+YДК=(X+Y)ДК.
При этом знаковые биты суммируются обычным образом, а возникающий при их сложении перенос игнорируется.
21

Во-вторых, любое число в дополнительном коде можно считать младшими битами («хвостом») числа любой длины, если содержимое знакового бита копировать влево.
Пример1.13. Сложитьвдополнительномкодечисла+2500 и-1200 (n=16).
Пример 1.14. Найти десятичный эквивалент числа X ДК = А2.
X ДК |
1010 |
0010 |
А2 |
X |
-0101 |
1110 |
-5E |
Получилось число -94.
Скопируем знаковый бит 8 раз влево, т.е. сделаем длину числа равной 16, и найдем десятичный эквивалент полученного числа.
X ДК |
1111 |
1111 |
1010 |
0010 |
FFA2 |
X |
-0000 |
0000 |
0101 |
1110 |
-005E |
В результате получается такое же число -94.
Таким образом, знаковый бит числа, представленного в дополнительном коде, разрешается копировать влево произвольное число раз, не изменяя при этом значение числа. Эта операция называется расширением знака, и она необходима в тех случаях, когда исходные операнды воперациях сложения ивычитания имеют различную длину.
В заключение отметим, что понятие дополнительного кода распространяется на системы счисления с любым основанием q. При этом во всех выкладках вместо двух будет фигурировать число q.
X ДК = q n − X .
Операция инвертирования цифры превращается здесь в нахождение дополнений до q -1.
22

Пример 1.15. Найти десятичный дополнительный код числа -638 (n=5).
Пример 1.16. Найти шестнадцатеричный дополнительный код числа
-ЗА7 (n=4).
Целые знаковые числа применяются в программах для представления тех числовых объектов, которые принципиально не могут иметь дробной части, но могут быть положительными и отрицательными. В языках программирования высокого уровня такие числа должны записываться без десятичной точки и объявляются спецификаторами типа SINT (n=8), INTEGER или INT (n=16), LONG или INTEGER4 (n=32).
1.3. Десятичные числа
Как уже отмечалось, существует противоречие между машинным представлением чисел (двоичная система счисления) и представлением чисел в нашей повседневной жизни (десятичные числа). Преобразования между ними в случае большого объема входных данных и выходных результатов ведет к заметным потерям процессорного времени. Вместе с тем имеется обширный круг задач, характеризующихся значительными объемами числовых данных и сравнительно простой их обработкой (экономические задачи, статистические расчеты, бухгалтерские выкладки и т. п.). В связи с этим потребовалось разработать такие формы представления чисел, в которых каким-либо образом совмещались бы двоичная и десятичная системы счисления. Такие формы получили общее название двоично-кодированного десятичного (Binary-Coded Decimal) представления или ВСD-кодирования. Общее свойство этих форм заключается в том, что за основу берется десятичное число, и каждая его цифра изображается тем или иным двоичным эквивалентом. К
23

настоящему времени из многочисленных систем двоичнодесятичного кодирования практическое применение находят только две: упакованные и неупакованные десятичные числа.
Упакованные десятичные числа. В упакованном формате, ко-
торый часто называют ВСD-представлением десятичных чисел, байт содержит две десятичные цифры. Младшая цифра занимает правую тетраду (биты 3:0), старшая – левую тетраду (биты 7:4). Обе цифры представлены своими двоичными эквивалентами, называемыми также кодом 8421 (по двоичным весам). Размещение десятичных цифр в байте показано на рис. 1.12, а.
Рис. 1.12. Формат упакованных десятичных чисел:
а - кодирование байта, б - многоразрядное число, в - размещение его в памяти
Многоразрядные упакованные десятичные числа занимают несколько смежных байтов. При необходимости работы со знаковыми числами старшая тетрада (иногда – младшая) старшего байта отводится для знака числа (рис. 1.12,6). Для кодирования знака используют шесть запрещенных тетрад 1010-1111 (или A-F), не представляющих десятичных цифр. Обычно для изображения знака плюс применяется код 1100 (С), а знака минус – 1101 (D). В связи с
24

необходимостью изображения знака многобайтные упакованные десятичные числа имеют нечетное число разрядов.
При программировании упакованные десятичные числа обычно определяются начальным адресом DNUM (это адрес младшего байта) и числом байтов N. Размещение упакованного десятичного числа в памяти показано на рис. 1.12, в.
Неупакованные десятичные числа. Неупакованный десятич-
ный формат, называемый также символьным кодом и кодом ASCII (в переводной литературе), приведен на рис. 1.13. Здесь байт содержит одну десятичную цифру, представленную в коде КОИ-7 (рис. 1.13, а). В этом коде десятичным цифрам соответствуют двоичные наборы от 0011 0000 (цифра 0) до 0011 1001 (цифра 9), или в шестнадцатеричной системе от 30Н до 39Н. Следовательно, можно считать, что собственно значение десятичной цифры занимает младшую тетраду и дается ее двоичным эквивалентом, а в старшей тетраде находится комбинация 0011.
Рис. 1.13. Формат неупакованных десятичных чисел:
а - кодирование байта, б - многоразрядное число, в - размещение его в памяти
Многоразрядные неупакованные десятичные числа занимают смежные байты (рис.1.13,6). Для знака числа отводится старший
25
байт, в котором комбинация 00101011 (2ВН) обозначает знак плюс, а комбинация 00101101 (20Н) – знак минус. Такие числа определяются в программах их начальным адресом DNUM и числом разрядов (байтов) или длиной N. Размещение неупакованного десятичного числа в памяти показано на рис.1.13, в.
1.4. Форматы чисел с плавающей точкой
Рассмотренный выше формат чисел с фиксированной точкой – не единственный из-за своих ограничений на диапазон чисел и представимые числовые значения (только целые числа). Очень мало задач, для решения которых достаточно оперировать только целыми числами. Поэтому для компьютеров разработан еще один формат представления чисел – формат с плавающей точкой, назы-
ваемый полулогарифмическим или экспоненциальным форматом или же научной записью.
В вычислениях с большими и малыми числами применяется следующая запись чисел:
X = +0.000035 = +3.5 ×10−5 =0.35 ×10−4 = +35 ×10−6 =...
X = −19000000 = −19 ×10+6 = −1.9 ×10+7 = −0.19 ×10+8 =...
Здесь число Х изображается как произведение некоторого другого числа на степень 10, т.е. основания системы счисления. Поскольку основание системы счисления известно, его можно не указывать, а взять от второго сомножителя только показатель степени. Другими словами, первый сомножитель записывается как есть, а от второго сомножителя 10±N записывается только ±N, т.е. его десятичный логарифм, что объясняет термин «полулогарифмический формат». Чтобы не путать знак показателя степени со знаком арифметической операции (сложение или вычитание), перед показателем степени принято записывать букву Е (от слова Ехроnent – показатель степени, экспонента), следовательно, число записывается в виде
± МЕ ± П.
Число ±М называется мантиссой (или значащей частью), которая может быть любым знаковым числом: целым, правильной дробью или смешанным числом. Нетрудно заметить, что знак мантиссы определяет знак всего числа. Число ±П называется порядком
26

(экспонентой); порядок может быть только целым знаковым числом. Буква Е – разделитель мантиссы и порядка. Чтобы сообщить о представлении числа с повышенной или двойной точностью, вместо буквы Е записывается буква D (от слова Double – двойной). В этом случае для мантиссы отводится больше разрядов.
Порядок ±П определяет истинное или фактическое положение десятичной точки вместо положения, которое она занимает в изображении мантиссы. Если порядок положительный, точка перемещается («плывет» – отсюда и название «плавающая точка») вправо на число разрядов, равное значению порядка.
Пример 1.17. Найти значение числа -0,0956 Е+2.
− 0.0956Ε + 2 = −0.0956 ×10+2 = −009.56 = −9.56
Если порядок отрицательный, точка перемещается («плывет») влево. Пример 1.18. Найти значение числа +1.289 Е-3.
+1.289Ε − 3 = +1.289 ×10−3 = +0.001289
Переход к изображению чисел с плавающей точкой в двоичной системе счисления не вызывает никаких трудностей: порядок и мантисса становятся двоичными числами, а основанием системы
счисления служит число 2:
± М ×2±П = ±МЕ ± П.
Как и в десятичной системе счисления, порядок определяет истинное положение двоичной точки, а перемещение ее осуществляется по двоичным разрядам.
Пример 1.19. Найти десятичные эквиваленты двоичных чисел с плавающей точкой.
− 0.000101Ε +100 = −0.000101 = −1 14
+10.111Ε - 11 = +0.010111 = +2364
Рассмотренное представление чисел имеет один существенный недостаток – запись числа оказывается неоднозначной.
Чтобы исключить неоднозначность записи чисел, во всех компьютерах принято нормализованное представление чисел с плавающей точкой, требующее, чтобы мантисса была правильной дробью и старшая цифра ее отличалась от нуля. Из приведенного выше при-
27

мера этим требованиям удовлетворяют только числа -0.353 Е+2 и 0.1012 Е+112.
Пример 1.20. Эквивалентные формы чисел с плавающей точкой.
−35.5 = −0.353 Ε + 2 = −0.00353 Ε + 4 = −35300 Ε − 2 =...
+1012 = +0.1012 Ε +112 = +0.001012 Ε +1012 = +1010.02 Ε −1 = ...
Кроме однозначности нормализованное представление обеспечивает также сохранение максимального количества значащих цифр мантиссы в результатах операций.
Пример 1.21. Пусть длина мантиссы составляет 6 битов. Определить нормализованное и ненормализованное представление числа +43 (+1010112).
Нормализованное представление: +0.1010112 Е+1102 Ненормализованное представление: +0.000101 0112 Е+10012 Во втором случае три младших бита мантиссы оказываются потерян-
ными и истинное значение числа равно + 645 × 2+9 = 40 , а не 43!
Классический формат с плавающей точкой. Формат чисел с плавающей точкой, который применялся в компьютерах первого и второго поколений, представлен на рис. 1.14. Он состоит из 4 полей: знак мантиссы Sм (он совпадает со знаком всего числа), п - битная мантисса, являющаяся правильной дробью, знак порядка Sм и p- битный порядок, который является целым числом.
Рис. 1.14. Классический формат чисел с плавающей точкой
Мантисса и порядок представлены в прямом коде – знак и абсолютное значение.
Пример 1.22. Пусть n=5 и p=3. Найти десятичные эквиваленты чисел с плавающей точкой.
1 11011 0 101 мантисса = − 27 |
, порядок = +5, |
32 |
|
число = − 27 32 × 2+5 = −27
28

0 |
11000 |
1 |
100 |
мантисса = + |
3 |
, порядок = -4, |
|
|
|
|
|
4 |
|
|
|
|
|
число = + 3 |
× 2 |
−4 = + 3 |
|
|
|
|
4 |
|
64 |
0 |
11111 |
0 |
111 |
мантисса = 31 |
, порядок = +7, |
|
|
|
|
|
|
32 |
|
|
|
|
|
число = 31 |
× 2+7 = +124 |
|
|
|
|
|
32 |
|
|
0 |
10000 |
1 |
111 |
мантисса = + |
1 |
, порядок = -7, |
|
|
|
|
|
2 |
|
|
|
|
|
число = + 1 |
× 2 |
−7 = + 1 |
|
|
|
|
2 |
|
256 |
Пример 1.23. Произвести обратное преобразование для того же фор-
мата с n=5 и p=3. |
|
|
|
|
|
Число = − 3 |
128 |
, двоичное представление |
− 0.0000011 |
мантисса |
|
|
|
2 |
|
||
= −0.11000 = − 3 |
|
, порядок = -1012=-5 1 11000 |
1 101 |
|
|
4 |
|
|
|
|
Число = +47.5, двоичное представление +101111.12 мантисса = +0.10111112= + 2332 , порядок = +1.102 = +6 0 10111 0 110
Последний пример показывает, что число +47.5 невозможно точно представить с принятым количеством битов мантиссы. Вместо него (без учета округления) представляется число +46.
Определим диапазон нормализованных чисел в формате, имеющем р битов порядка и п битов мантиссы. Поскольку для прямого кода диапазон симметричен относительно нуля, производятся расчеты только для положительных чисел. Минимальное число получается, если взять минимальную мантиссу и максимальный (по абсолютному значению) отрицательный порядок, т.е.
Хмин = 0 100…00 1 11…11
Здесь мантисса равна + 12 , а порядок −(2 p −1) , поэтому
X мин + 12 ×2− (2 p −1) =2− 2 p
Чтобы получить максимальное число, необходимо взять максимальную мантиссу и максимальный положительный порядок:
Хмакс = 0 111...11 0 11...11
29

Нетрудно установить, что
X макс =+(1 −2−n ) ×22 p−1.
Если в мантиссе пренебречь членом 2−n , то
X макс ≈22 p−1.
Найденные для Хмин и Хмакс соотношения показывают, что диапазон представимых чисел определяется только количеством р битов порядка. С увеличением р диапазон очень быстро расширяется как в область очень больших, так и в область очень малых чисел. Воспользовавшись приближенным равенством 210≈103, покажем, насколько быстро расширяется диапазон:
p = 6 |
Хмин = 2 |
−26 |
|
= 2−64 ≈10−19 , |
|||||||||
|
Хмакс |
≈ 2 |
26 −1 |
|
= 2 |
63 |
|
19 |
, |
|
|||
|
|
|
|
|
|
≈10 |
|
|
|||||
p = 7 |
Хмин = 2−27 |
= 2−128 |
|
≈10−38 , |
|||||||||
|
Хмакс |
≈ 2 |
27 |
−1 |
|
127 |
≈10 |
38 |
, |
||||
|
|
|
|
= 2 |
|
|
|
||||||
p = 8 |
Хмин = 2−28 |
= 2−256 ≈10−76 , |
|||||||||||
|
Хмакс |
≈ 228 −1 = 2255 |
≈1076 |
|
Увеличение длины порядка всего на один бит удваивает показатель степени у десяти для минимального и максимального чисел.
Рассмотрим, на что влияет количество битов мантиссы п. Возьмем любое число Х в формате с плавающей точкой X = М×2П. На числовой оси ему соответствует определенная точка. Очевидно, ближайшие к нему представимые числа Х-бл и Х+бл отличаются на единицу младшего бита мантиссы(рис. 1.15):
Примечание. Для просто-
ты предполагается, что мантисса числаХнеравна
100…00 или 11…11, т.к.
любые уменьшения или увеличения таких значений мантиссы связаны с модификацией порядка. Это ограничение оказываетсянесущественным.
30