Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы / Мышев А.В. (ч.1)

.pdf
Скачиваний:
38
Добавлен:
11.06.2015
Размер:
864.53 Кб
Скачать

продолжение выполнения программы не имеет смысла. Если результат операции оказывается меньше Zмин, фиксируется антипереполнение; большинство компьютеров при антипереполнении возвращают как результат операции нуль. Область чисел от – Zмин до + Zмакс, за исключением истинного нуля, называют машинным нулем.

Рис. 1.6. Система машинных чисел

В компьютерах применяется исключительно двоичная позиционная система счисления – любое число представляется последовательностью из 1 и 0.

Примечание. В соответствии с правилами употребления точки и запятой в языках высокого уровня и в машинных листингах отделяют целую часть числа от дробной точкой и говорят о форматах с фиксированной точкой и с плавающей точкой.

Позиционные системы счисления. В позиционных системах счисления, к которым относится и общепринятая десятичная система счисления, числовое значение цифры зависит от ее местоположения (позиции) в последовательности цифр, изображающей число, например, в числе 636.96 одна и та же цифра 6 обозначает (слева направо) шесть сотен, шесть единиц и шесть сотых. Это представление есть сокращенная запись следующей суммы:

636.96 =6 ×102 +3×101 + 6 ×100 +9 ×101 +6 ×102.

Любое десятичное число

X = an1an2...a1a0a1a2...am ,

где a {0,1,2,3,4,5,6,7,8,9} – десятичные цифры, n – число разрядов

целой части, m – число разрядов дробной части, можно развернуть в сумму:

11

X = an1 ×10n1 +an2 ×10n2 +... +a0 ×100 +

+a

 

×101

+... +a

 

n

 

×10i.

(*)

1

m

×10m = a

 

 

 

i=1

i

 

 

Здесь значение i называется разрядом, величина 10i весом i-го разряда, а n + m длиной числа. Число десять называется основанием системы счисления; оно равно отношению весов двух соседних разрядов.

Принципы построения десятичной системы счисления распространяются и на другие позиционные системы счисления. Выберем в качестве основания целое положительное число q>1. за цифры рассматриваемой системы счисления естественно принять первые порядковые десятичные числа 0, 1, 2, …, q-1; основание q будет иметь вид 10q (нижний индекс показывает основание системы счисления; в десятичных числах он будет опускаться). Если q больше десяти, придется вводить специальные символы, соответствующие цифрам десять, одиннадцать и т. д. Если q=16, цифрами будут 0, 1, … 9, А, В, С, D, E и F. Для данной системы счисления справедливо приведенное соотношение (*).

Пример 1.1. Найти десятичный эквивалент восьмеричного числа

376.28.

X = 376.28 = 3 ×82 + 7 ×81 + 6 ×80 + 2 ×81 = 254.25.

В двоичной системе счисления имеется всего две цифры: 1 и 0.

Пример 1.2. Найти десятичный эквивалент двоичного числа

100110.1012.

X=100110.101 =1×25 + 0 ×24 + 0 ×23 +1× 22 +1×21 +

+0 ×20 +1×21 + 0 ×22 +1×23 = 38.625.

Двоичная система счисления получила исключительное распространение в вычислительной технике благодаря возможности представления цифры каждого разряда электронной схемой с двумя устойчивыми состояниями и простоте выполнения арифметических операций.

Перевод чисел из одной системы счисления в другую. По-

скольку люди и компьютеры пользуются различными системами

12

счисления, следует познакомиться с принципами перевода чисел из одной системы счисления в другую. Рассмотрим перевод десятичных чисел в системы с произвольными основаниями q, т.к. преобразование числа в десятичное осуществляется по соотношению (*)

и никаких трудностей не вызывает. Разберем перевод чисел вручную (машинный перевод покажем далее).

Пусть задано целое десятичное число Х и его необходимо перевести в систему счисления с основанием q, т.е. найти цифры ai в записи an1an2 ...a1a0 . Воспользуемся соотношением (*) и запи-

шем в общем виде:

X =an1qn1 +an2qn2 +... +a1q1 + a0 .

Разделим обе части этого равенства (а фактически только исходное число X) на q:

X / q =a

n1

q n2 + a

n2

q n3 +... + a

( a

0

).

 

 

1

 

 

Как результат получается целое частное

X(1) =an 1an 2...a2a1,

аостаток от деления равен цифре a0 . Частное X (1) имеет такой же вид, как и исходное число X, поэтому для нахождения a1 необхо-

димо разделить X (1) на q. В результате получается новое частное

X(2) =an 1an 2...a3a2,

аостаток от деления равен a1 . Повторяющееся выполнение ука-

занных действий позволяет найти все цифры ai . Это приводит к

следующему правилу.

Правило первое. Для перевода целого десятичного числа Х в систему счисления с основанием q необходимо последовательно делить исходное число Х и образующиеся частные на q до получения частного, равного нулю. Искомое представление есть последовательность остатков от операций деления, причем первый остаток дает младшую цифру.

13

Пример 1.3. Перевести число 236 в восьмеричную систему счисления

(q =8).

Выполняются операции деления:

Следовательно, восьмеричная запись числа 236 имеет вид 3548

Пример 1.4. Перевести число 236 в двоичную систему счисления. Простые операции деления на 2 производятся в уме, и получается короткая запись:

Записывая снизу вверх, получим 236= 111011002.

Рассмотрим перевод правильных дробей. Правильную десятичную дробь Х требуется перевести в систему счисления с основанием q; иначе говоря, необходимо найти цифры ai в записи

(0.a1a2...am ) . Воспользуемся соотношением (*):

X =a1q1 + a2q2 + a3q3 +... + am qm .

Как и при переводе целых чисел, цифры ai находятся после-

довательно. Умножим обе части приведенного равенства (а фактически только исходную дробь X) на q:

X ×q =a1 + a2q1 + a3q2 +... + am qm +1.

14

Цифра a1 равна целой части полученного произведения, а

дробная часть его соответствует новой правильной дроби X (1) :

X (1) =a2q1 + a3q2 +... +am qm +1.

При умножении X (1) на q целая часть произведения дает цифру a2 , а дробная часть соответствует новой правильной дроби

X (2) =a3q2 +... + am qm + 2.

Отсюда вытекает следующее правило перевода.

Правило второе. Для перевода правильной десятичной дроби Х в систему счисления с основанием q необходимо последовательно умножать исходную дробь и дробные части получающихся произведений на q. Искомые цифры нового представления есть последовательность целых частей произведений, причем первая из них дает старшую цифру a1.

Пример 1.5. Перевести десятичную дробь 0.8125 в восьмеричную систему счисления.

Выполняем операции умножения:

Восьмеричное представление десятичной дроби 0.8125 есть 0.648. Пример 1.6. Перевести десятичную дробь 0.3 в двоичную систему

счисления. Производим операции умножения:

Как видно, при умножении никогда не получится нулевая дробная часть, поэтому десятичная дробь не имеет точного двоичного представления, а с точностью до шестого двоичного разряда равна 0.0100112.

Сформулированные правила перевода справедливы не только для перевода десятичных чисел в систему счисления с основанием

15

q, но и для перевода чисел из системы счисления с основанием q1

в систему счисления с основанием q2 .В этом случае операции ум-

ножения и деления нужно производить по правилам системы счисления с основанием q1 . Поскольку легко оперировать только деся-

тичными числами, обычно такое преобразование осуществляется через промежуточную десятичную систему счисления, что условно можно записать в виде q1 10 q2.

Рассмотрим элементарные приемы взаимного преобразования двоичных и восьмеричных (а также шестнадцатеричных) чисел: т.к. 8=23=10002 и 16=24= 10 0002 , эти преобразования выполняются без каких-либо вычислений.

Правило третье. Для перевода двоичного числа в систему счисления с основанием 8 (16) необходимо исходное число влево и вправо от точки сгруппировать по три (четыре) бита, а затем каждую группу записать одной восьмеричной (шестнадцатеричной) цифрой.

Пример 1.7. Перевести 1111010,10112 в системы счисления с основаниями 8 и 16.

1111010. 10112

= 001

111

010. 101 1002 = 172.548

1111010. 10112

= 0111

1010.

10112 = 7A.B16

Правило четвертое. Для перевода восьмеричного (шестнадцатеричного) числа в двоичное необходимо каждую цифру исходного числа записать в виде эквивалентного ей трехбитного (четырехбитного) двоичного числа.

Пример 1.8. Перевести числа 273.48 и 5AF1816 в двоичную систему счисления.

273.48=010

111

011.

1002=10111011.12

5АF.1816 = 0101

1010

1111.0001 10002=10110101111.000112

Целые беззнаковые двоичные числа. Формат целых двоичных чисел без знака имеет вид, показанный на рис. 1.7. Здесь значок вставки (^) обозначает местоположение двоичной точки. Как видно из этого рисунка, все разряды числа являются значащими, а двоичная точка находится справа или, как говорят, фиксирована после

16

младшего значащего разряда. Отсюда появляется еще одно название этого формата и других аналогичных форматов – формат c фиксированной точкой. Следовательно, в этом формате представимы только целые числа 0, 1,2, ..., 2n-1 и любая комбинация битов (двоичный набор) является допустимой

Рис. 1.7. Формат целых

Рис. 1.8. Общий формат целых

беззнаковых двоичных чисел

знаковых чисел

Целые беззнаковые числа при программировании используются для представления тех числовых объектов, которые принципиально не могут быть отрицательными. Примерами таких объектов служат адреса ячеек памяти, номера строк исходной программы, счетчики повторений циклов и т. п. В различных языках программирования для указания типа беззнаковых целых чисел применяются объявле-

ния (спецификаторы) типов BYTE (n=8), WORD (n=16), ADDRESS (n=16), UNSIGNED (n=16) и др.

Целые знаковые двоичные числа. Чтобы компьютеры могли оперировать положительными и отрицательными числами, один из разрядов необходимо отвести для изображения знака чисел S. Обычно им является старший (левый) бит, а стандартное кодирование знака имеет вид

0 - число положительное,

S =

1- число отрицательное.

Знаковые числа длиной n битов представляются в формате, показанном на рис. 1.8. Имеется несколько способов кодирования знаковых чисел.

Прямой код. Наиболее естественное кодирование знаковых чисел заключается в том, чтобы поместить в бит S знак числа, а остальные биты использовать для абсолютного значения числа. В англоязычной литературе для этого способа принят выразительный термин «знак и модуль», а в нашей литературе закрепился термин

17

«прямой код». Отображение двоичных n-битных наборов на числовую ось для прямого кода показано на рис. 1.9. Диапазон предста-

вимых чисел составляет от (2n1 1) до +(2n1 1) , а число ноль может быть положительным 00 ...00 и отрицательным 100 ...00.

Рис. 1.9. Представление чисел в прямом коде

Пример 1.9. Представить в прямом коде числа +108 и -108.

+108 0000 0000 0110 1100 006С -108 1000 0000 0110 1100 806С

Прямой код наиболее удобен и в нем очень легко реализуется операция изменения знака числа (операция NEGATE). Однако с «компьютерной» точки зрения у прямого кода есть существенные недостатки. Во-первых, неудобно иметь два представления нуля и, во-вторых, операция алгебраического сложения требует анализа знаков операндов и выбора фактической операции сложения или вычитания.

Указанные недостатки привели к тому, что прямой код лишь иногда применяется при вводе и выводе данных.

Дополнительный код. В дополнительном коде сохраняется общий формат знаковых целых чисел, показанный на рис. 1.8, но отображение двоичных наборов на числовую ось становится другим

(рис. 1.10). Положительные числа от 0 до 2n1 1 представляются без всяких изменений, как в прямом коде, а для отрицательных чисел введено специальное кодирование. Так, число -1 кодируется

набором 11...11, а число 2n1 – 100...00. Еще одно наглядное изображение чисел в дополнительном коде показано на рис. 1.11.

18

Вне круга показаны все 4-битные наборы, а внутри – представляемые ими числа в дополнительном коде.

Получение дополнительного кода отрицательного числа – X осуществляется по следующему правилу:

X ДК =2n X ,

где п – длина машинного слова.

Рис. 1.10. Представление чисел в дополнительном коде

Рис. 1.11. Круговая диаграмма дополнительного кода

Пример 1.10. Образовать дополнительный код числа -1429 (n=16).

19

Стандартное получение дополнительного кода несколько неудобно из-за операции вычитания, поэтому обычно дополнительный код отрицательного числа – Х образуют по следующему правилу.

Правило пятое. Для получения дополнительного кода отрицательного числа – Х необходимо записать n-битный модуль этого числа. Затем все биты инвертируются, т.о. заменяются на противоположные и к полученному числу прибавляется единица.

Пример 1.11. Найти дополнительный код числа -1429 (n=16).

Это же правило можно сформулировать по-другому.

Правило шестое. Для получения дополнительного кода числа – Х необходимо записать n-битный модуль этого числа, затем вычесть единицу и инвертировать все биты.

Оба правила (пятое и шестое) элементарно доказываются при условии, что инвертирование n-битного числа Х эквивалентно вычитанию его из числа 11…11, равного 2n – 1. Тогда, например, по пятому правилу имеем

инвертировать все биты

 

2n 1

 

X

 

 

 

 

 

 

 

 

 

 

 

 

прибавить 1

2n 1

 

X

 

 

 

+1 = 2n

 

X

 

 

 

 

 

 

 

 

Действия по шестому правилу принимают вид

вычесть 1

 

X

 

1

 

 

инвертировать все биты

 

(2n 1) (

 

X

 

1)= 2n

 

X

 

 

 

 

В обоих случаях результатом оказывается дополнительный код числа – Х.

Когда получение дополнительного кода осуществляется вручную, удобно воспользоваться следующим правилом.

Правило седьмое. Для получения дополнительного кода числа – Х необходимо записать n-битный модуль этого числа. Затем следу-

20