Представление информации в памяти компьютера


































































































кОмпьютерное представление чисел.ppt
- Количество слайдов: 98
Представление информации в памяти компьютера
Формы записи числа Aq = ± (an-1*qn-1 + an-2*qn-2+ … + a 0*q 0 + a-1*q-1 +a-2*q-2+a- m*q ), -m где Aq — число, q — основание системы счисления, ai — цифры алфавита данной системы счисления, n — количество разрядов целой части числа, m — количество разрядов дробной части числа.
Формы записи числа Aq = ± (an-1*qn-1 + an-2*qn-2+ … + a 0*q 0 + a-1*q-1 +a-2*q-2+a- m*q ), -m Например: 26, 38710 = 2*101 + 6*100 + 3*10 -1 + 8*10 -2 +7*10 -3; 101, 112 = 1*22 + 0*21 + 1*20 + 1*2 -1 +1*2 -2.
Размещение информации в памяти компьютера y=x+b; b=5; b- константа x, y - переменные • область с именем b • область с именем x • область с именем y
Особенности представления чисел в компьютерах • Целые числа • Вещественные числа
Представление целых чисел 0000 – 0 0001 – 1 0010 – 2 0011 – 3 0100 – 4 0101 – 5 0110 – 6 0111 – 7 1000 – 8 1001 – 9 1010 – 10 1011 – 11 1100 – 12 1101 – 13 1110 – 14 1111 – 15 16 ? – переполнение (overflow)
Представление целых чисел Связано ли переполнение со системой счисления?
Целые числа без знака Чтобы закодировать целое число без знака, достаточно перевести его в двоичную систему счисления и дополнить старшие разряды (слева) нулями до требуемой разрядности. Например: 2810 в 8 разрядах 0001 1100 в 16 разрядах 0000 0001 1100.
Целые числа без знака min max 8 разрядов 0000 1111 0 255 min 16 разрядов 0000 0 max 1111 63 535
Целые числа без знака K – разрядность (количество бит) Xmax =2 k -1
Целые числа без знака В языке Паскаль для размещения беззнаковых целых чисел используется тип BYTE и WORD. Переменные типа Byte занимают 1 байт в памяти компьютера, их значения лежат в диапазоне от 0 до 255. Переменные типа Word занимают 2 байта в памяти компьютера, их значения лежат в диапазоне от 0 до 65 535.
Целые числа без знака Особенности переполнения K=8. Максимальное число равно 255 (11112). Если добавить к этому числу 1 произойдёт переполнение и процессор вытесняет старшую единицу двоичного числа 1 0000, оставляя в реальных 8 разрядах 0000, т. е. 0. Вычитая единицу из минимального значения 0, к которому добавлен старший разряд за пределами 8 - битной ячейки, получим 1112=25510.
Целые числа без знака FF 16 0 255 С 016 64 4016 192 128 8016
Числовая система компьютера является конечной и цикличной
Целые числа со знаком Прямой код 4 -х разрядная ячейка: +4 0100 -4 1100
Целые числа со знаком Прямой код 4 -х разрядная ячейка: +4 0100 -4 1100
Сложение и вычитание в 2 с/с
Операции над целыми числами со знаком Множество двоичных чисел бесконечно, а разрядная сетка представления компьютерного числа конечна.
Операции над целыми числами со знаком Если при сложении результат «не умещается» в разрядную сетку, происходит вытеснение старшего бита в несуществующий бит слева – явление переполнения сверху. 1111+0000 0001 =1 0000; 1 0000 0 0001 0 1111 (-1) Заметим, что фактически вычитается не из 0, а из 256.
Коды отрицательных чисел 1111 принимается за -1 1110 -2 1111 1101 -3 1111 1000 -4 В общем случае вычисление происходит по формуле 2 к-Х (К – количество разрядов в разрядной сетке представления числа; Х – вычитаемое). Это способ кодирования отрицательных чисел, но…
Коды отрицательных чисел Другой способ кодирования отрицательных чисел. -Х=-Х-1+1=(-1 -Х)+1 Значит, для вычисления значения -Х необходимо из -1 (1111) вычесть Х и затем прибавить единицу (00001). При вычитании любого числа из 1111 есть что «занимать» , следовательно, эта операция вычитания всегда возможна.
Коды отрицательных чисел Другой способ кодирования отрицательных чисел. Например: 1111 – 0000 1011=1111 0100. инверсия
Коды отрицательных чисел Правило (алгоритм) получения кода отрицательного целого числа (-Х): 1. выполнить инверсию каждого разряда двоичного представления числа Х. Полученный код называется обратным. 2. к полученному результату прибавить единицу. В результате получается дополнительный код, т. к. он дополняет число до 2 К.
Коды отрицательных чисел Например, определим дополнительный код числа «- 16» , который хранится в 8 -разрядной ячейке. Х=16=100002 Х 2 =0001 0000 инверсия (not Х) 1110 1111 +1 1111 0000 Для проверки можно сложить полученный результат с исходным числом и убедиться, что сумма обратиться в ноль (перенос из старшего разряда не учитываем): 11110000 -16 0001 0000 +16 0000
Коды отрицательных чисел Повторное применение алгоритма всегда приводит к восстановлению первоначального числа. Вместо вычитания используется сложение с дополнительным кодом вычитаемого, поэтому не нужно проектировать специальное устройство для вычитания чисел.
Х 10 -128 -127 … -1 0 1 … 127 Х 16 80 81 … FF 00 01 … 7 F Х 2 1000 1 0001 … 1111 0000 0001 … 0111 1111 8016 7 F 16 -128 127 С 016 -64 64 4016 -1 0 1 0116 FF 16 016
Код 0 1 2 … 7 F 80 81 … FE FF Без 0 1 2 … 127 128 129 … 254 255 знака Со 0 1 2 … 127 -128 -127 … --2 -1 знаком Числа со знаком -128 0 127 255 Беззнаковые числа
К 8 16 32 64 Хmax 127 32 767 2 147 483 647 9 223 372 036 854 775 807 Хmin -128 -32 768 - 2 147 483 648 -9 223 372 036 854 775 808
В программировании переменные целого типа Byte занимают 1 байт памяти компьютера, их значения лежат в диапазоне от 0 до 255. Тип Byte является беззнаковым переменные целого типа Word занимают 2 байта памяти компьютера, их значения лежат в диапазоне от 0 до 65535. Тип Word является беззнаковым переменные целого типа Integer занимают 2 байта памяти компьютера, их значения лежат в диапазоне от -32768 до 32767. Тип Integer является знаковым
ОПЕРАЦИИ С ЦЕЛЫМИ ЧИСЛАМИ
Сложение и вычитание Используются не только для расчётов по формулам, но и для организации вычислений (например, счётчик). Благодаря тому, что отрицательные числа кодируются в дополнительном коде, операция вычитания заменяется операцией сложения и выполняется по одному алгоритму. Со знаковым разрядом обращаются точно также как и со всеми остальными.
Примеры (для 8 -разрядной арифметики) 5 + 7: 000 01012 (510) + 000 01112 (710) =000 11002 (1210).
Примеры (для 8 -разрядной арифметики) 5 -9: 510=0000 01012 – прямой код числа 5 +910=0000 10012 – прямой код числа +9 1111 01102 – обратный код числа +9 +12 1111 01112 – доп. код числа -9
Примеры (для 8 -разрядной арифметики) 0000 01012+1111 01112=1111 11002 это число отрицательное. По схеме дополнительного кода 1111 11002 – исходное число 0000 00112 – обратный код (инверсия) +1 0000 01002 – дополнительный код =410 Результат: 5 -9=-4
Переполнение в результате сложения При сложении двух чисел с одинаковыми знаками может случиться переполнение – сумма будет содержать слишком большое количество разрядов. Например, 96+33 В знаковом представлении 96 0 110 0000 33 0 010 0001 1 0001 (-127)
Обнаружение ошибки Старший (знаковый) бит S дублируется слева S’. Выполняется поразрядное сложение вместе со знаковым разрядом. При сравнении двух знаковых бита суммы фиксируется, что результат неверный. 0 0 1100000 (9610) 0 0 0100001 (3310) 0 1 0000001 S’ S
Сумматор • Сложение многоразрядных двоичных чисел в компьютере выполняет специальное устройство – сумматор. • Вычитание сводится к сложению с дополнительным кодом вычитаемого, поэтому отдельного «блока вычитания» в компьютере нет.
Умножение и деление Умножение заменяют многократным сложением, а деление – многократным вычитанием.
Двоичное умножение 910 (0000 10012) х 510 (0000 01012) 00001001 х 00000101 00001001 00001001___ 0000101101 (4510)
Компьютерное умножение • вычисление очередного произведения в зависимости от младшего бита второго сомножителя: оно равно нулю (если этот бит нулевой) или первому сомножителю (если бит равен единице); • сложение содержимого сумматора с очередным произведением; • сдвиг содержимого сумматора влево на один разряд; • сдвиг второго сомножителя вправо на 1 разряд.
• Умножение, как и сложение, выполняется одинаково для положительных и отрицательных чисел (в дополнительном коде). • Деление можно рассматривать как многократное вычитание.
Сравнение В отличие от арифметических действий операция сравнения выполняется по- разному для чисел со знаком и без знака, поэтому современные процессоры имеют разные команды для сравнения чисел со знаком и без знака. Это нужно учитывать в процессе программирования, чтобы установленный тип переменных не вызвал ошибок.
Код 0 1 2 … 7 F 80 81 … FE FF Без 0 1 2 … 127 128 129 … 254 255 знака Со 0 1 2 … 127 -128 -127 … --2 -1 знаком 7 F 16 сравнить с 8116 Без знака: 12910 > 12710 Со знаком: -12710 < 12710
Сдвиги двоичного числа позволяют быстро умножить или разделить число на степень двойки: 2, 4, 8 и т. д. Программисты часто пользуются различными сдвигами.
Идея операции сдвига Все биты кода одновременно сдвигаются в соседние разряды влево или вправо. Аппаратная реализация сдвига: регистр, содержащий число сбрасывается в ноль, при этом из тех разрядов, где исчезла единица, электрический импульс проходит в соседние разряды и устанавливает их в единицу. При этом важно, что все разряды обрабатываются одновременно.
Логический сдвиг
Пример Логический сдвиг используют для быстрого умножения и деления 1210 8 -разрядный код 0000 1100. После логического сдвига влево получим 0001 1000=24 10 Логический сдвиг влево на 1 разряд увеличивает целое положительное число вдвое, а сдвиг вправо делит на 2 нацело.
Сдвиг для отрицательных чисел «-8» . Восьмиразрядное представление этого числа 1111 1000. При сдвиге влево получится 1111 0000. А это число – дополнительный код числа «-1610» . Значит число удвоилось! При сдвиге вправо получится 0111 1100. Результат не верен.
Арифметический сдвиг Применяется для отрицательных чисел. Его единственное отличие от логического состоит в том, что, старший бит (знаковый) не меняется, т. е. знак числа остаётся прежним.
Пример арифметического сдвига Применим арифметический сдвиг вправо к 8 -разрядному коду десятичного числа « -8» 1111 1000. Получается 1111 1100 – дополнительный код числа «-4» . При арифметическом сдвиге вправо отрицательного числа «-8» получилось деление исходного числа на 2.
Циклический сдвиг Используется в программировании для «просмотра» (мониторинга, отслеживания) одного из битов. При циклическом сдвиге бит из одного крайнего разряда переносится в другой крайний «по кругу» ( «по циклу» ).
Циклический сдвиг влево
Циклический сдвиг Если сделать последовательно 8 циклических сдвигов 8 -битного числа, то каждый его бит на каком-то шаге окажется на месте младшего разряда, где его уже можно выделить определёнными программистскими приёмами (с помощью логической операции «И» с маской 1). Циклический сдвиг позволяет «просмотреть» все биты и вернуться к исходному значению.
ХРАНЕНИЕ В ПАМЯТИ ВЕЩЕСТВЕННЫХ ЧИСЕЛ
• Целые числа дискретны, а вещественные – непрерывны, а значит не могут быть полностью корректно перенесены в дискретную по своей природе вычислительную машину.
Масштабирование данных Маленькие числа умножались на определённые коэффициенты, а большие, напротив, делились. Масштабы подбирались так, чтобы результаты всех операций, включая промежуточные, не выходили за пределы разрядной сетки, и в то же время обеспечивалась максимально возможная точность (все разряды данных по возможности находились в пределах сетки).
Числа с плавающей запятой (floating point – плавающая точка) А=±Z·BP, где Z называют значащей частью, Р – порядком числа. Например, заряд электрона равен -1, 6· 10 -19 кулона, а скорость света в вакууме составляет 3· 108 м/с.
Неоднозначность 23, 4 2340· 10 -2= 234· 10 -1= 23, 4· 100= 2, 34· 101= 0, 234· 102= 0, 0234· 103=…
Оптимальное представление Чтобы не записывать 0 дробной части в разряды числа оптимальным будет вариант, когда целая часть равна нулю, а первая ненулевая цифра находится сразу после запятой. В нашем примере: 0, 234. Можно не указывать целую часть и разделительную запятую. Осталось указать только порядок.
Способы представления • оптимальный с теоретической точки зрения, в котором целая часть нулевая, а первая цифра дробной части ненулевая (0, 234· 102); • более удобный с практической точки зрения, в котором целая часть состоит из единственной ненулевой цифры (2, 34· 101).
Компьютерное представление В компьютере используется такое представление вещественных чисел с плавающей запятой, при котором значащая часть Z удовлетворяет условию 1≤ Z ≤ B , где В – основание системы счисления. Такое представление называется нормализованным. • Нормализованное представление числа единственно. Например: 2, 34· 101.
Нормализация Любое число может быть легко нормализовано. Единственное, но важное исключение из правила составляет нуль – для него невозможно получить Z 1. Число 0, в котором все биты нулевые, в качестве исключения считается нормализованным.
Представление двоичных чисел А=± Z· 2 P, причём 1 ≤ Z < 2. Например: -710=-111· 20=-1, 11· 210. В этой записи значащая часть и порядок записаны в двоичной системе! Z=1, 11; P=10.
Скрытая единица Значащая часть двоичного числа (исключая, разумеется, ноль!) начинается с единицы, т. к. 1 ≤ Z < 2. Это так называемая скрытая единица не хранится в ОЗУ, что позволяет сэкономить ещё один дополнительный разряд значащей части. То, что остаётся после «скрытия» единичной целой части, можно вполне обоснованно называть «мантиссой» .
Итак • При кодировании вещественного числа с плавающей запятой фактически хранятся две величины: его значащая часть (significant) и порядок. • От разрядности значащей части зависит точность вычислений. • От разрядности порядка зависит диапазон представления чисел.
Характеристики стандартных вещественных типов данных, используемых в математическом сопроцессоре Intel
Планирование памяти под Single 4 байта (32 бита) 23 младших бита (с номерами от 0 до 22) хранят значащую часть числа. Следующие 8 битов (с номерами от 23 до 30) хранят порядок числа. 1 старший (31 бит) отведён под знак числа.
Размещение данных типа Single 3 3 2 2 2 2 2 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0 Правила двоичного кодирования вещественных чисел во многом отличаются от правил кодирования целых чисел.
Например: -17, 2510 • 17, 25=10001, 012. • Нормализация: передвинем запятую на 410=1002 разряда влево 10001, 012· 20=1, 000101· 2100 • Построим значащую часть, «скрыв» единицу в целой части: M =Z -1=0, 0001010… 0. • Исходное число (-17, 25) отрицательное. Следовательно знаковый разряд нужно установить в единицу.
Размещение данных типа Single 3 3 2 2 2 2 22 2 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 21 0 9 8 7 6 5 4 3 2 1 0 1 00 0 1 0 0 0 0 0 В отличие от целых чисел значащая часть вещественных чисел храниться в прямом коде. Таким образом, значащие части положительного и равного по модулю отрицательного числа одинаковы, а отличаются они только старшим (знаковым битом) S.
Кодирование порядка Кодирование со смещением Pd=P+d, Pd>0 Для чисел типа single d=12710=7 F 16. Для нашего примера порядок P=1002. 12710=0111 11112. Тогда Pd=1002 +111 11112 =1000 00112.
Кодирование порядка Соберём теперь Значащую часть М, порядок со сдвигом Pd и знак S в единое 32 -разрядное двоичное число: 1 10000011 000101000000000 C 1 8 A 00 0016. 00 00 8 А С 1.
NAN числа Имеют максимально возможный порядок. • чисел типа single при смещённом порядке Pd =255; • чисел типа double при смещённом порядке Pd =2047. Подобные «неправильные» данные возникают только в результате ошибок в вычислениях.
Итак Мы увидели, что целые и вещественные числа хранятся в памяти компьютера совершенно по-разному. Поэтому представление чисел 3 и 3. 0 будет разным. По-разному будут производиться для этих чисел и действия компьютерной арифметики.
Программирование На языке Паскаль для вещественных чисел используются переменные типа Real. Под эту переменную в памяти компьютера отводится 6 байт (48 бит): 39 бит под значимую часть (мантиссу). Тем самым достигается точность до 11 -12 десятичных знаков после запятой. Переменные этого типа могут принимать значения по модулю от минимального 2, 9· 10 -39 до максимального 1, 7· 10 -38.
Характеристики вещественных типов Название Обознач Кол-во дес. Диапазон Длина ение знач. цифр изменения внутреннего порядка представлен ия в байтах Вещественный Real 11 … 12 -39 … +38 6 Одинарной Single 7 … 8 -45 …+38 4 точности Двойной Double 15 … 16 -324 … +308 8 точности Расширенный Extended 19 … 20 -4951 … +4932 10 От разрядности значащей части зависит точность вычислений, а от разрядности порядка – диапазон представления чисел.
ОПЕРАЦИИ С ВЕЩЕСТВЕННЫМИ ЧИСЛАМИ
Пример: Сложение Сложим 7, 2510=111, 012 и 1, 7510=1, 112. 1. Нормализация: 111, 01*20=1, 1101*210 1, 11*20 значащие части и порядки чисел указаны в двоичной системе счисления Не будем использовать «скрытую» единицу, которая используется только при сохранении чисел в памяти
Пример: Сложение 2. Выравнивание порядков: Процессор перед сложением вещественных чисел выравнивает их порядки до большего
Алгоритм выравнивания: 1. Если p 2=p 1, то порядки выровнены и преобразования закончены 2. p 2= p 2+1 3. Сдвинуть значащую часть z 2 на один разряд вправо 4. перейти к шагу 1.
Блок-схема выравнивания порядков
Пример: сложение 2. Выравнивание порядков: 1, 1101*210 1, 11*20 =0, 0111*210. 3. Сложение 1, 1101 0, 0111 10, 0100 10, 01*210=910 10, 01*210=1, 001*211
Особые случаи • При выравнивании порядков происходит сдвиг значащей части меньшего из чисел вправо, при этом её младшие (правые) разряды могут выйти за пределы разрядной сетки и могут быть отброшены. При сложении чисел с большой разностью порядков в результате таких сдвигов меньшее число может стать равно нулю.
Особые случаи Например, • значащая часть занимает 24 разряда • разность порядков у чисел A и B (B 0) составляет 2610 • при выравнивании порядков произойдёт 26 сдвигов значащей части вправо • абсолютно все (!) её разряды исчезнут. В результате сложения окажется, что A+B=A, хотя B 0.
Умножение и деление • При перемножении достаточно перемножить их значащие части, а порядки сложить. • При делении значащие части делятся, а порядки вычитаются. • Результат приводится (при необходимости) к нормализованному виду.
Пример: умножение Умножим числа 1, 2510=1, 012 и 4, 010=100, 02. Нормализованный вид: 1, 01= 1, 01*20 и 100*20=1, 0*210 1, 01*1, 0=1, 01 (значащие части) 0+10=10 (порядки) Результат: 1, 01*210 (уже нормализованный вид) 1, 01*210=101*20=510.
Выводы • Для хранения чисел в памяти компьютера используется конечное число разрядов. Из-за этого числа в компьютере имеют ограниченный диапазон, а результаты вычислений могут быть неточными (погрешности вычислений).
Выводы • Для хранения целого числа может быть использовано 8, 16, 32 или 64 бита памяти. Каждый дополнительный бит расширяет диапазон допустимых чисел в 2 раза.
Выводы • Отрицательные числа хранятся в дополнительном двоичном коде, который позволяет выполнять вычисления с положительными и отрицательными числами по одному и тому же алгоритму.
Выводы • Вещественные числа хранятся в памяти компьютера в формате с плавающей запятой: отдельно значащая часть и порядок. Из-за ограниченности числа разрядов вещественное число, как правило, не удаётся точно представить в памяти.
Выводы • От разрядности значащей части зависит точность вычислений, а от разрядности порядка – диапазон представления чисел
Выводы • Для вещественных чисел используется более медленная арифметика. • При вычислениях с вещественными числами накапливаются ошибки. Для повышения точности расчётов нужно стараться, если возможно, использовать только операции с целыми числами.
ПРОГРАММИРОВАНИЕ
Допустимые арифметические операции в языке Паскаль Переменные типа данных «целое» принимают только целочисленные значения. Над целыми числами допустимы основные арифметические операции: • сложение (“+”), • вычитание (“-“), • умножение (“*”),
Допустимые арифметические операции в языке Паскаль • выделение частного от деления (div): ( 5 div 2 результат 2) • выделение остатка от деления (mod): (5 mod 2 результат 1) Операции div и mod не могут быть использованы при работе с переменными типа Real.
Арифметические операции над действительными числами Над действительными операндами можно выполнять следующие арифметические операции, дающие действительный результат: • сложение( «+» ) • вычитание ( «-» ) • умножение ( «*» ) • деление ( «/» )
• При написании программы следует не допускать ошибок, связанных с несовместимостью типов переменных.
Использование типов переменных в функциях • При использовании стандартных функций языка программирования необходимо строго соблюдать типы переменных как аргументов, так и самой функции.

