Лекция 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.