Смекни!
smekni.com

Теоретические основы информатики 3 (стр. 8 из 11)

Например, операция вычитания 7-5 аналогична операции сложения 7 + (-5). Следовательно, если потребуется вычесть 5 (с кодом 0101) из 7 (с кодом 0111), то машина, прежде всего, заменит 5 на -5 (с кодом 1011) и затем выполнит операцию сложения, результатом которой будет 0010, то есть код числа 2:

-7 -0111 +0111

5 0101 1011

2 0010

1.1.8.3. Проблема переполнения

Есть проблема в любом представлении чисел в двоичном дополнительном коде - ограничение на размер чисел, представляемых данным количеством битов. Например, нельзя получить пра­вильного ответа, выполнив операцию сложения 5 + 4, если будем выполнять сложение в 4-битовом двоичном дополнительном коде. Ведь у числа 9 нет соответствующей записи. На самом деле мы получим ответ — 7. Такая ошибка называется переполнением (overilov), она возникает, когда нужно сохранить число, не попадающее в диапазон чисел, которые могут быть представлены в двоичном дополнительном коде. Переполнение возникает, когда нужно сложить два положительных или два отрицатель­ных числа. В обоих случаях можно проверить, есть ли ошибка, посмотрев на знаковый разряд полученного результата, то есть переполнение возникает, если сумма двух положительных чисел имеет код отрицательного числа или сумма двух отрицательных чисел имеет код положительного числа.

Большинство машин манипулируют более длинными последовательностями битов, чем те, которые здесь обсуждаются, и операции с большими числами не вызывают переполнения. В настоящее время принято использовать 32-битовые последова­тельности для хранения чисел в двоичном дополнительном коде, что позволяет порождать числа до

2 147 438 647, прежде чем возникнет переполнение. Если нужно записать большее число, то можно использовать более длинный код или можно изменить единицы измерения. Например, использование в расчетах километров, а не метров позволит уменьшить размер чисел и достичь необходимой точности вычислений.

Проблема состоит в том, что компьютер может ошибаться, и пользова­тель должен знать о возможной опасности такой ошибки. Программисты и пользо­ватели из-за своей самоуверенности игнорируют тот факт, что маленькие числа могут складываться и порождать большие. Например, раньше было приня­то использовать 16-битовый двоичный код, который означал, что переполнение не возникнет, пока не появится значение 215 = 32 768. Например девятнадцатого сентября 1989 года компьютерная система в госпитале допустила ошибку после долгих лет надежной работы. Исследование показало, что тот день был 32 768-м днем после 1 января 1900 года. Как вы думаете, какова цена этой ошибки?

1.1.8.4. Представление с избытком

Другой способ представления целочисленных значений называется представле­нием с избытком (excess notation). Коды, соответствующие числовым значениям, имеют одинаковую длину. Для того чтобы составить таблицу кодов, сначала нужно выбрать длину последовательности битов, затем выписывать эти наборы в пря­мом порядке. Можно заметить, что код с одной 1 в позиции старшего разряда находится примерно посередине списка. Пусть он будет представлением нуля; коды до него используются для представления 1, 2, 3 и т. д., коды после него используются для -1,-2, -3 и т. д. Окончательный вариант таблицы 4-битовых кодов изображен в таблицах на рис 1.12. Можно заметить, что число 5 имеет код 1101, а чис­ло -5 имеет код 0011. Обратите внимание на то, что различие между представле­нием в двоичном дополнительном коде и избыточном коде заключается в том, что знаковый разряд у них имеет противоположное значение.

Таблица кодов, изображенная на рисунке 1.12, называется представлением с избытком восемь. Для того чтобы понять, почему это так, сначала переведём коды из таблицы в десятичную систему счисления, как обычный двоичный код, и сравним полученные значения со значениями в таблице. В каждом случае мы обна­ружим, что полученный результат превосходит код в представлении с избытком на восемь. Например, последовательность 1100 в двоичной системе является ко­дом 12, но в представлении с избытком она является кодом 4; последователь­ность 0000 в двоичной системе является кодом 0, а в представлении с избыт­ком — кодом 8. Точно так же 5-битовое представление с избытком будет на­зываться представлением с избытком 16, так как, например, последователь­ность 10000 будет кодом 0, а не 16, как в двоичной записи.

Можно убе­диться, что 3-битовое представление с избытком является представлением с избытком четыре.

Набор битов

Значение

Набор битов

Значение

1111

7

111

3

1110

6

110

2

1101

5

101

1

1100

4

100

0

1011

3

011

-1

1010

2

010

-2

1001

1

001

-3

1000

0

000

-4

0111

-1

0110

-2

0101

-3

0100

-4

0011

-5

0010

-6

0001

-7

0000

-8

Рис. 1.12. 4-битовое и 3-битовое представление с избытком

1.1.9. Хранение дробей

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

1.1.9.1. Представление с плавающей точкой

Рассмотрим представление чисел с плавающей точкой (floating-point notation) на приме­ре. Для хранения числа будем использовать только 1 байт памяти. В машинах обычно используются более длинные коды, а этот 8-битовый фор­мат является уменьшенным аналогом существующих систем, и позволяет объяс­нить основные понятия.

Сначала, старший разряд бита назовем знаковым разрядом. Как и рань­ше, 0 в позиции знакового разряда означает, что число положительное, 1 в пози­ции знакового разряда означает, что число отрицательное. Затем разделим остав­шиеся в байте семь разрядов на две группы или два поля: порядок (exponent field) и мантиссу (mantissa field). Пусть первые три бита после знакового будут поряд­ком, а оставшиеся четыре — мантиссой.

Теперь рассмотрим значение каждой из частей на примере. Байт содержит такую последовательность битов: 00101011. Проведем анализ этой последовательности, применяя определения, данные выше: знаковый разряд равен 0, порядок — 010 и мантисса — 1011. Чтобы расшифровать значение, хранящееся в байте, сначала извлечем мантиссу и поместим слева от нее разделительную точку, получим: .1011.

Позиции битов