Лекция 1. Внутреннее машинное представление чисел.

advertisement
Лекция 1
1. Внутреннее машинное представление целых
и вещественных чисел
Для представления информации в памяти ЭВМ (как числовой, так и не числовой) используется двоичный способ кодирования.
Представление целых чисел
Целые числа в компьютере хранятся в памяти в формате с фиксированной запятой или
фиксированной точкой. В этом случае каждому разряду ячейки памяти соответствует всегда
один и тот же разряд числа, а запятая находится справа после младшего разряда, т.е. вне разрядной сетки.
Множество целых чисел, представимых в памяти ЭВМ ограничено и зависит от размера
ячеек памяти (машинного слова), используемых для их хранения. В k-разрядной ячейке может
храниться 2k (655636) различных значений целых чисел.
Вообще, разряды нумеруются справа налево, начиная с 0. Ниже показана нумерация бит в
двухбайтовом машинном слове.
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
В данной ячейке можно хранить 216 целых чисел. Диапазон допустимых значений зависит
также от того, будут ли в ячейке храниться числа со знаком или без знака.
Для записи целого числа без знака достаточно перевести его в двоичную систему счисления и при необходимости дополнить результат слева незначащими нулями.
Пример 1
Получить внутреннее представление целого числа 129 без знака в однобайтовой ячейке
памяти.
Решение:
1) 12910=100000012
2) 1000 0001
Пример 2
Данное внутреннее машинное представление числа в однобайтовом машинном слове – 9С.
Определить, что это за число.
Решение:
1) 9С16 =1001 11002
2) 27+24+23+22=128+16+8+4=15610
Чтобы записать внутреннее машинное представление целого числа со знаком, необходимо
найти его дополнительный код.
Представление целых положительных чисел
Дополнительный код целого положительного числа совпадает с его прямым кодом. Для
его получения необходимо:
1. Перевести число N в двоичную систему счисления.
2. Полученный результат дополнить слева незначащими нулями до k разрядов.
3. При необходимости перевести число в сжатую шестнадцатеричную форму.
Пример 3
Получить внутреннее представление целого числа 1607 в 2-х байтовой ячейке. Записать
ответ в 16-ричной форме.
Решение:
1) 160710 =110010001112
2) Внутреннее представление этого числа: 0000 0110 0100 0111
3) 16-ричная форма: 0647.
Представление целых отрицательных чисел
Для представления отрицательных чисел используется дополнительный код. Дополнительный код позволяет заменить арифметическую операцию вычитания операцией сложения,
что существенно упрощает работу процессора и увеличивает его быстродействие.
Алгоритм получения внутреннего представления целого отрицательного числа N, хранящегося в k-разрядном машинном слове:
1. Получить внутреннее представление положительного числа N.
2. Получить обратный код этого числа заменой 0 на 1 и 1 на 0, т.е значения всех бит инвертировать.
3. К полученному числу прибавить 1 (получить дополнительный код).
4. При необходимости записать сжатое внутренне машинное представление.
Пример 4
Получить внутреннее представление целого числа -1607 в 2-х байтовой ячейке. Записать
ответ в 16-ричной форме.
Решение:
1) Внутреннее представление этого положительного числа: 0000 0110 0100 0111
2) Обратный код – 1111 1001 1011 1000
3) Дополнительный код - 1111 1001 1011 1001
4) Сжатый 16-ричный код – F9B9
В случае представления величины со знаком самый левый (старший) разряд указывает на
положительное число, если содержит нуль, и на отрицательное, если — единицу. Это необходимо учитывать при обратном переводе.
Пример 5
Дано сжатое 16-ричное внутреннее представление числа – CF18. Определить, что это за
число.
Решение:
1) CF18 = 1100 1111 0001 1000
2) Число отрицательное, так как старший разряд равен 1, поэтому получаем обратный код
– 1100 1111 0001 0111 (вычесть 1)
3) Прямой код – 0011 0000 1110 1000
4) 30E816= 1252010
Стандарт IEEE 754
Для представления действительных чисел в памяти компьютера был разработан стандарт
IEEE 745. Он используется многими микропроцессорами и программными средствами. Рассмотрим основные понятия этого стандарта
Нормализованная и денормализованная форма вещественных чисел
Вещественные числа в памяти компьютера представляются в формате с плавающей десятичной запятой (экспоненциальной форме).
Любое число А может быть представлено в экспоненциальной форме:
А = m • qn, где m – мантисса числа, q – основание системы счисления., n – порядок числа.
Например: 555,55=0,55555•103
Так как вариантов представления одного и того же числа в экспоненциальной форме бесконечное множество, то для внутреннего машинного представления условились представлять
числа в нормализованной или денормализованной форме.
В денормализованной форме мантисса должна отвечать следующему условию: она должна быть правильной дробью и иметь после запятой цифру, отличную от нуля, то есть 1/n ≤ |m|
<1
Например, 555,55 – естественная форма, 0,55555•103 - денормализованная форма. Это касается и отрицательных чисел, т.к. мантисса в условии взята по модулю.
Пример 6
Записать числа в денормализованной форме (в десятичном виде):
а) 217, 93410 б) 7532110 в) 10,010110 г) 20045010
Нормализованная мантисса содержит свой старший бит слева от точки. В общем случае
мантисса должна удовлетворять условию 1<=|m|<10. Так как числа представлены в двоичном
виде, то этот бит всегда равен 1. Иными словами нормализованная мантисса принадлежит интервалу 1 <= |m| < 2. В памяти машины этот бит не хранится, т.е. является "скрытым”.
Для положительных и отрицательных чисел мантисса в памяти представлена в прямом
коде.
Пример 7
Представить число 155,625 в двоичной системе счисления в экспоненциальном нормализованном виде.
155,62510 = 10011011,1012 - число двоичной системе
Приведем полученное число к нормализованному виду в десятичной и двоичной системе:
1,55625∙102 = 1,0011011101∙2111
В результате мы получили основные составляющие экспоненциального нормализованного
двоичного числа:
Мантиссу m=1,0011011101
Экспоненту exp2= +111
Вычисление машинного порядка
Для хранения вещественных чисел в памяти компьютера выделяются следующие разряды:
- знак числа (старший бит),
- машинный порядок числа
- мантисса.
Чтобы не хранить знак порядка используется так называемый машинный порядок. Машинный порядок смещен относительно математического порядка и имеет только положительные значения. Смещение выбирается так, чтобы минимальному математическому значению порядка соответствовал ноль.
Связь между машинным порядком (Мр) и математическим (р) в рассматриваемом случае
выражается формулой: Мр = (2n-1-1) + p, где n – это количество бит, отводимых на порядок.
Пример 8
Записать машинный порядок для числа 34,48, если известно, что под него отводится 11
бит.
1) Двоичное представление числа – 100010, 011112
2) Нормализованная форма числа - 1,0001001111*2101
3) Mp=210-1+5=102810= 100000001002
Формальное представление вещественных чисел в стандарте IEEE 754
Пример 9
Записать внутреннее машинное представление числа 155,625 для 32-битного формата (на
порядок отводится 8 бит).
Решение:
1) 155,62510 = 10011011,1012 - число двоичной системе
2) 1,55625∙102 = 1,0011011101∙2111 – нормализованный вид числа
3) 27-1+7=128-1+7=13410=100001102 - машинный порядок
4) 01000011 00011011 10100000 00000000 – результат
Для 64-битного представления чисел (double) на порядок отводится 11 бит, для 16-битного
(real) и 32-битного (single) – 8 бит, для 80-битного. (extended) – 15 бит.
Преобразование машинного представления чисел в вещественное число
Пример 10
Восстановить число по внутреннему машинному представлению:
01000011 00011011 10100000 00000000
Так как представление 32-битное, то, значит, под машинный порядок отводится 8 бит. Переведем значение машинного порядка в десятичную систему
100001102=128+4+2=13410
Подставим в формулу
134 = (27-1) + p, 134=127+p, p=7
Перенесем запятую в мантиссе на 7 разрядов (помним, что целая часть равна 1):
10011011,1012=27+24+23+21+20+2-1+2-3 =128+16+8+2+1+1/2+1/8=155+0,5+0,125= 155,625
Представление числа 0 и ∞
Приведенная выше формула не применяется в следующих случаях (примеры даны для 32разрядного представления):
1. число 00 00 00 00 считается числом +0
число 80 00 00 00 считается числом -0
Два нуля используются для симметричности.
2. число 7F 80 00 00 считается числом +∞
число FF 80 00 00 считается числом -∞
Числа, которые больше границ диапазона представления чисел считаются бесконечными.
Операции с целыми числами. Переполнение
Благодаря тому, что отрицательные числа кодируются в дополнительном коде, при сложении можно не обращать внимания на знаки слагаемых, то есть со знаковым разрядом обращаются точно так же, как со всеми остальными. Например, сложим числа 5 и -9, используя 8разрядную двоичную арифметику.
0000 0101
1111 0111
-------------1111 1100
Переведем полученное число в десятичную систему: 1111 1100 -> 1111 1011-> 0000 0100,
то есть -4.
При сложении двух числе с одинаковыми знаками может случиться переполнение, то есть
сумма будет содержать слишком большое количество разрядов. Например, сложим числа 96 и
33. Их сумма 129 выходит за восьмибитную сетку. Чтобы обнаружить переполнение, добавим к
обоим слагаемым еще один старший бит, совпадающий со знаковым:
0 01100000
0 00100001
-----------------------0 10000001
Знаковый разряд результата получился равен 1, то есть сумма получилась отрицательной
(посчитать результат), хотя оба слагаемых положительные. Старший бит результата, не поместившийся в разрядную сетку, попадает в специальную ячейку процессора, которая называется
битом переноса. Если бит переноса не совпадает со знаковым, то произошло переполнение и
выдается соответствующая ошибка переполнения.
То же самое получается, если сложить два достаточно больших отрицательных числа.
Например, -96 и -33.
1 10100000
1 11011111
-----------------------1 01111111
Получается, что в результате первый бит равен 0, хотя должен быть отрицательным.
Рассмотрим операцию сдвига. Сдвиг двоичного числа позволяет быстро умножить или
разделить число на степени двойки (на 2, 4, 8 и т.д.). Идея сдвига заключается в том, что все биты кода одновременно сдвигаются в соседние разряды влево или вправо. Отдельно надо говорить о двух крайних битах, в которых нет «соседей». Рассмотрим сдвиг влево. Для самого
младшего бита данные взять неоткуда, поэтому в него заносится ноль. Самый старший бит (слева) будет просто потерян. При сдвиге влево будет происходить умножение числа на 2.
Например
00000111->00001110 (7->14)
При сдвиге вправо число будет делиться на 2 нацело.
Например
00010001 ->00001000 (17->8)
При сдвиге вправо отрицательных чисел старший разряд необходимо заполнить 1, а не 0.
Download