|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Представление числовых данных в памяти компьютера.Дата добавления: 2014-11-24 | Просмотров: 1715
Для представления информации в памяти ЭВМ (как числовой, так и не числовой) используется двоичный способ кодирования. Элементарная ячейка памяти ЭВМ имеет длину 8 бит (байт). Каждый байт имеет свой номер (его называют адресом). Наибольшую последовательность бит, которую ЭВМ может обрабатывать как единое целое, называют машинным словом. Длина машинного слова зависит от разрядности процессора и может быть равной 16, 32 битам и т.д. Для кодирования символов достаточно одного байта. При этом можно представить 256 символов (с десятичными кодами от 0 до 255). Набор символов персональных ЭВМ, совместимых с IBM PC, чаще всего является расширением кода ASCII (American Standard Code for Information Interchange – стандартный американский код для обмена информацией). В некоторых случаях при представлении в памяти ЭВМ чисел используется смешанная двоично-десятичная «система счисления», где для хранения каждого десятичного знака нужен полубайт (4 бита) и десятичные цифры от 0 до 9 представляются соответствующими двоичными числами от 0000 до 1001. Например, упакованный десятичный формат, предназначенный для хранения целых чисел с 18-ю значащими цифрами и занимающий в памяти 10 байт (старший из которых знаковый), использует именно этот вариант. Другой способ представления целых чисел – дополнительный код. Диапазон значений величин зависит от количества бит памяти, отведенных для их хранения. Например, величины типа Integer (все названия типов данных здесь и ниже представлены в том виде, в каком они приняты в языке программирования Turbo Pascal. В других языках такие типы данных тоже есть, но могут иметь другие названия) лежат в диапазоне от -32768 (-215) до 32767 (215 – 1) и для их хранения отводится 2 байта (16 бит); типа LongInt – в диапазоне от -231 до 231 – 1 и размещаются в 4 байтах (32 бита); типа Word – в диапазоне от 0 до 65535 (216 – 1) (используется 2 байта) и т.д. Как видно из примеров, данные могут быть интерпретированы как числа со знаками, так и без знаков. В случае представления величины со знаком самый левый (старший) разряд указывает на положительное число, если содержит нуль, и на отрицательное, если – единицу. Вообще, разряды нумеруются справа налево, начиная с 0. Ниже показана нумерация бит в двухбайтовом машинном слове. Дополнительный код положительного числа совпадает с его прямым кодом. Прямой код целого числа может быть получен следующим образом: число переводится в двоичную систему счисления, а затем его двоичную запись слева дополняют таким количеством незначащих нулей, сколько требует тип данных, к которому принадлежит число. Например, если число 37(10) = 100101(2) объявлено величиной типа Integer (шестнадцатибитовое со знаком), то его прямым кодом будет 0000000000100101, а если величиной типа LongInt (тридцатидвухбитовое со знаком), то его прямой код будет 00000000000000000000000000100101. Для более компактной записи чаще используют шестнадцатеричное представление кода. Полученные коды можно переписать соответственно как 0025(16) и 00000025(16). Дополнительный код целого отрицательного числа может быть получен по следующему алгоритму: 1. записать прямой код модуля числа; 2. инвертировать его (заменить единицы нулями, нули – единицами); 3. прибавить к инверсному коду единицу. Например, запишем дополнительный код числа -37, интерпретируя его как величину типа LongInt (тридцатидвухбитовое со знаком): 1. прямой код числа 37 есть 00000000000000000000000000100101; 2. инверсный код 11111111111111111111111111011010; 3. дополнительный код 11111111111111111111111111011011 или FFFFFFDB(16). При получении числа по его дополнительному коду, прежде всего, необходимо определить его знак. Если число окажется положительным, то просто перевести его код в десятичную систему счисления. В случае отрицательного числа необходимо выполнить следующий алгоритм: 1. вычесть из кода числа 1; 2. инвертировать код; 3. перевести в десятичную систему счисления. Полученное число записать со знаком минус. Примеры. Запишем числа, соответствующие дополнительным кодам: 1. 0000000000010111. Поскольку в старшем разряде записан нуль, то результат будет положительным. Это код числа 23. 2. 1111111111000000. Здесь записан код отрицательного числа. Исполняем алгоритм: 1) 1111111111000000(2) – 1(2) = 1111111110111111(2); 2) 0000000001000000; 3) 1000000(2) = 64(10). Ответ: – 64.
Основные понятия алгебры логики Объектами алгебры логики или булевой алгебры являются высказывания. Высказывание –это любое предложение какого-либо языка (утверждение), содержание которого можно определить как истинное или ложное. Всякое высказывание или истинно, или ложно; быть одновременно и тем и другим оно не может. В естественном языке высказывания выражаются повествовательными предложениями. Восклицательные и вопросительные предложения высказываниями не являются. Высказывания могут выражаться с помощью математических, физических, химических и прочих знаков. Из двух числовых выражений можно составить высказывания, соединив их знаками равенства или неравенства. Высказывание называется простым (элементарным), если никакая его часть сама не является высказыванием. Высказывание, состоящее из простых высказываний, называются составным(сложным). Простые высказывания в алгебре логики обозначаются заглавными латинскими буквами: А = {Аристотель – основоположник логики}, В = {На яблонях растут бананы}. Обоснование истинности или ложности простых высказываний решается вне алгебры логики. Например, истинность или ложность высказывания: «Сумма углов треугольника равна 180 градусов» устанавливается геометрией, причем – в геометрии Евклида это высказывание является истинным, а в геометрии Лобачевского – ложным. Истинному высказыванию ставится в соответствие 1, ложному 0. Таким образом, А=1, В=0. Алгебра логики отвлекается от смысловой содержательности высказываний. Ее интересует только один факт – истинно или ложно данное высказывание, что дает возможность определять истинность или ложность составных высказываний алгебраическими методами. Основные операции алгебры высказываний: Логическая операция КОНЪЮНКЦИЯ (лат. conjunctio – связываю):
Логическая операция ДИЗЪЮНКЦИЯ (лат. disjunctio – различаю):
Логическая операция ИНВЕРСИЯ (лат. inversio – переворачиваю):
Функция логического сложения ИЛИ (ЛогЗнач1;ЛогЗнач2;…) дает значение TRUE (Истина), только тогда, когда хотя бы один логический аргумент имеют значение TRUE (1). Функция логического отрицания НЕ(ЛогЗнач) дает значение TRUE (Истина), когда логический аргумент имеют значение FALSE (0) и, наоборот, значение FALSE (Ложь), когда логический аргумент имеют значение TRUE (1). Логическая операция ИМПЛИКАЦИЯ (лат. implicatio – тесно связываю):
Логическая операция ЭКВИВАЛЕНЦИЯ (лат. аequivalens – равноценное):
Логические операции имеют следующий ПРИОРИТЕТ: действия в скобках, инверсия, &, , , ~. Таблицу, показывающую, какие значения принимает составное высказывание при всех сочетаниях (наборах) значений входящих в него простых высказываний, называют таблицей истинности составного высказывания. Составные высказывания в алгебре логики записываются с помощью логических выражений. Для любого логического выражения достаточно просто построить таблицу истинности. Алгоритм построения таблицы истинности: 1. подсчитать количество переменных n в логическом выражении; 2. определить число строк в таблице m = 2n; 3. подсчитать количество логических операций в формуле; 4. установить последовательность выполнения логических операций с учетом скобок и приоритетов; 5. определить количество столбцов в таблице: число переменных плюс число операций; 6. выписать наборы входных переменных с учетом того, что они представляют собой натуральный ряд n-разрядных двоичных чисел от 0 до 2n-1; 7. провести заполнение таблицы истинности по столбикам, выполняя логические операции в соответствии с установленной в п.4 последовательностью. Наборы входных переменных, во избежание ошибок, рекомендуют перечислять следующим образом: а) определить количество наборов входных переменных; б) разделить колонку значений первой переменной пополам и заполнить верхнюю часть колонки 0, а нижнюю – 1; в) разделить колонку значений второй переменной на четыре части и заполнить каждую четверть чередующимися группами 0 или 1, начиная с группы 0; г) продолжать деление колонок значений последующих переменных на 8, 16 и т.д. частей и заполнение их группами 0 или 1 до тех пор, пока группы 0 и 1 не будут состоять из одного символа. Пример: Для формулы A&(B C) построить таблицу истинности алгебраически и с использованием электронных таблиц. Решение: Количество логических переменных 3, следовательно, количество строк в таблице истинности должно быть 23 = 8. Количество логических операций в формуле 5, следовательно, количество столбцов в таблице истинности должно быть 3 + 5 = 8.
Логической (булевой) функцией называют функцию F(Х1, Х2, ..., Хn), аргументы которой Х1, Х2, ..., Хn (независимые переменные) и сама функция (зависимая переменная) принимают значения 0 или 1. Таблицу, показывающую, какие значения принимает логическая функция при всех сочетаниях значений ее аргументов, называют таблицей истинности логической функции. Таблица истинности логической функции n аргументов содержит 2n строк, n столбцов значений аргументов и 1 столбец значений функции. Логические функции могут быть заданы табличным способом или аналитически – в виде соответствующих формул. Если логическая функция представлена с помощью дизъюнкций, конъюнкций и инверсий, то такая форма представления называется нормальной. Существует 16 различных логических функций от двух переменных. Логические выражения называются равносильными, если их истинностные значения совпадают при любых значениях, входящих в них логических переменных. В алгебре логики имеется ряд законов, позволяющих производить равносильные преобразования логических выражений. Приведем соотношения, отражающие эти законы. 1. Закон двойного отрицания:не(не А)=A. Двойное отрицание исключает отрицание. 2. Переместительный (коммутативный) закон: –для логического сложения: А B=B A; – для логического умножения: A & B = B & A. Результат операции над высказываниями не зависит от того, в каком порядке берутся эти высказывания. 3. Сочетательный (ассоциативный) закон: –для логического сложения: (A B) C=A (B C); для логического умножения:(A & B) & C = A & (B &C). При одинаковых знаках скобки можно ставить произвольно или вообще опускать. 4. Распределительный (дистрибутивный) закон: –для логического сложения: (A B)&C=(A&C) (B&C); для логического умножения: (A & B) C = (A C) & (B C). Определяет правило выноса общего высказывания за скобку. 5. Закон общей инверсии (законы де Моргана): – для логического сложения: ; для логического умножения: . 6. Закон идемпотентности (от латинских слов idem – тот же самый и potens -сильный; дословно – равносильный):– для логического сложения: A A=A;- для логического умножения: A&A=A. Закон означает отсутствие показателей степени. 7. Законы исключения констант: – для логического сложения: A 1=1,A 0=A;- для логического умножения: A & 1 = A, A & 0 = 0. 8. Закон противоречия:A&(не A)=0. Невозможно, чтобы противоречащие высказывания были одновременно истинными. 9. Закон исключения третьего:A (не A) = 1. Из двух противоречащих высказываний об одном и том же предмете одно всегда истинно, а второе – ложно, третьего не дано. 10. Закон поглощения:- для логического сложения: A (A&B)=A; – для логического умножения: A & (A B) = A. 11. Закон исключения (склеивания):– для логического сложения: (A&B) (&B)=B; – для логического умножения: (A B) & ( B) = B. 12. Закон контрапозиции (правило перевертывания):(A B) = (B A).
Справедливость приведенных законов можно доказать табличным способом: выписать все наборы значений А и В, вычислить на них значения левой и правой частей доказываемого выражения и убедиться, что результирующие столбцы совпадут. Пример. Упростить логическое выражение:
Типовые логические узлы Мы уже знаем, что любую достаточно сложную логическую функцию можно реализовать, имея относительно простой набор базовых логических операций. Первоначально этот тезис был технически реализован «один к одному»: были разработаны и выпускались микросхемы, соответствующие основным логическим действиям. Потребитель, комбинируя имеющиеся в его распоряжении элементы, мог получить схему с реализацией необходимой логики. Довольно быстро стало ясно, что подобное «строительство здания из отдельных кирпичиков» не может удовлетворить практические потребности. Промышленность увеличила степень интеграции МС и начала выпускать более сложные типовые узлы: триггеры, регистры, счетчики, дешифраторы, сумматоры и т.д. (продолжая аналогию со строительством, этот шаг, видимо, следует уподобить панельному способу домостроения). Новые микросхемы давали возможность реализовывать еще более сложные электронные логические устройства, но человеку свойственно не останавливаться на достигнутом: рост возможностей порождает новые потребности. Последовал переход к большим интегральным схемам (БИС), представлявшим из себя функционально законченные узлы, а не отдельные компоненты для их создания (как тут не вспомнить блочный метод постройки здания из готовых комнат). Наконец, дальнейшая эволюция технологий производства ИМС привела к настолько высокой степени интеграции, что в одной БИС содержалось функционально законченное изделие: часы, калькулятор, небольшая специализированная ЭВМ... Если посмотреть на внутреннее устройство типичного современного компьютера, то там присутствуют ИМС очень высокого уровня интеграции: микропроцессор, модули ОЗУ, контроллеры внешних устройств и др. Фактически каждая микросхема или небольшая группа микросхем образуют функционально законченный блок. Уровень сложности блока таков, что разобраться в его внутреннем устройстве для неспециалиста не только нецелесообразно, а просто невозможно. К счастью, для понимания внутренних принципов работы современной ЭВМ достаточно рассмотреть несколько типовых узлов, а изучение поведения БИС заменить изучением функциональной схемы компьютера. Обработка информации в ЭВМ происходит, как уже не раз отмечалось выше, путем последовательного выполнения элементарных операций. Эти операции менее многочисленны, нежели набор команд ЭВМ (которые реализуются через цепочки этих операций). К элементарным операциям относятся: установка – запись в операционный элемент (например, регистр) двоичного кода; прием – передача (перезапись) кода из одного элемента в другой; сдвиг – изменение положения кода относительно исходного; преобразование – перекодирование; сложение – арифметическое сложение целых двоичных чисел – и некоторые другие. Для выполнения каждой из этих операций сконструированы электронные узлы, являющиеся основными узлами цифровых вычислительных машин – регистры, счетчики, сумматоры, преобразователи кодов и т.д. В основе каждой из элементарных операций лежит некоторая последовательность логических действий, описанных выше. Проанализируем, например, операцию сложения двух чисел: 3+6.Имеем: + 110 На каждом элементарнейшем шаге этой деятельности двум двоичным цифрам сопоставляется двоичное число (одно- или двузначное) по правилам: (0,0) => О, (0,1) => 1, (1.0) => 1, (1,1) => 10. Таким образом, сложение цифр можно описать логической бинарной функцией. Если дополнить это логическим правилом переноса единицы в старший разряд (оно будет сформулировано ниже при описании работы сумматора), то сложение полностью сведется к цепочке логических операций. Для дальнейшего рассмотрения необходимо знать условные обозначения базовых логических элементов. Они приведены на рис. 1.5. Соответствующие таблицы истинности приведены в предыдущем пункте. Отметим, что на практике логические элементы могут иметь не один или два, а значительно большее число входов. Рис. 1.5. – Условные обозначения основных логических элементов
Итак, примем к сведению, что простейшие логические элементы, изображенные на рис. 1.5, можно реализовать аппаратно. Это означает, что можно создать электронные устройства на транзисторах, резисторах и т.п., каждое из которых имеет один или два входа для подачи управляющих напряжений и один выход, напряжение на котором определяется соответствующей таблицей истинности. На практике логическому «да» («истина», или цифра 1 в таблицах истинности) соответствует наличие напряжения, логическому «нет» («ложь», или цифра 0) – его отсутствие. Вопрос, на который мы должны ответить, таков: как с помощью таких элементарных схем реализовать сложные цифровые устройства, необходимые для работы ЭВМ? При этом, учитывая существование прямых соответствий между логическими и электронными схемами, вполне достаточно достичь понимания на уровне логических схем. В качестве характерных устройств выберем два наиболее важных и интересных – триггер (рис. 1.6) и сумматор. Первый – основа устройств оперативного хранения информации, второй служит для сложения чисел: Рис. 1.6. – Логическая схема триггера
Перейдем к описанию работы триггера.Соответствующая его работе таблицаистинности приведена ниже:
Таблица 1.2. – Таблица истинности RS-тригтера
Как видно из рис.1.6, простейший вариант триггера собирается из четырех логических элементов И-НЕ, причем два из них играют вспомогательную роль. Триггер имеет два входа, обозначенные на схеме R и S, а также два выхода, помеченные буквой Q – прямой и инверсный (черта над Q у инверсного выхода означает отрицание). Триггер устроен таким образом, что на прямом и инверсном выходах сигналы всегда противоположны. Как же работает триггер? Пусть на входе R установлена 1, а на S – 0. Логические элементы D1 и D2 инвертируют эти сигналы, т.е. меняют их значения на противоположные. В результате на вход элемента D3 поступает 1, а на D4 – 0. Поскольку на одном из входов D4 есть 0. независимо от состояния другого входа на его выходе (он же является инверсным выходом триггера!) обязательно установится 1. Эта единица передается на вход элемента D3 и в сочетании с 1 на другом входе порождает на выходе D3 логический 0. Итак, при R=1 и S=0 на прямом выходе триггера устанавливается 0, а на инверсном – 1. Обозначение состояния триггера по договоренности связывается с прямым выходом. Тогда при описанной выше комбинации входных сигналов результирующее состояние можно условно назвать нулевым: говорят, что триггер «устанавливается в 0» или «сбрасывается». Сброс по-английски называется «Reset», отсюда вход, появление сигнала на котором приводит к сбросу триггера, обычно обозначают буквой R. Проведите аналогичные рассуждения для «симметричного» случая R =0 и S = 1. Вы увидите, что на прямом выходе получится логическая 1, а на инверсном – 0. Триггер перейдет в единичное состояние – «установится» (установка по-английски – «Set»). Теперь рассмотрим наиболее распространенную и интересную ситуацию R = 0 и S = 0 – входных сигналов нет. Тогда на входы элементов D3 и D4, связанные с R и S будет подана, и их выходной сигнал будет зависеть от сигналов на противоположных входах. Нетрудно убедится, что такое состояние будет устойчивым. Пусть, например, на прямом выходе 1. Тогда наличие единиц на обоих входах элемента D4 «подтверждает» нулевой сигнал на его выходе. В свою очередь, наличие 0 на инверсном выходе передается на D3 и поддерживает его выходное единичное состояние. Аналогично доказывается устойчивость картины и для противоположного состояния триггера, когда Q = 0. Таким образом, при отсутствии входных сигналов триггер сохраняет свое «предыдущее» состояние. Иными словами, если на вход R подать 1, а затем убрать, триггер установится в нулевое состояние и будет его сохранять, пока не поступит сигнал на другой вход S. В последнем случае он перебросится в единичное состояние и после прекращения действия входного сигнала будет сохранять на прямом выходе 1. Мы видим, что триггер обладает замечательным свойством: после снятия входных сигналов он сохраняет свое состояние, а значит может служить устройством для хранения одного бита информации. В заключение проанализируем последнюю комбинацию входных сигналов: R = 1 и S = 1. Нетрудно убедиться (проделайте необходимые рассуждения самостоятельно), что в этом случае на обоих выходах триггера установится I! Такое состояние помимо своей логической абсурдности еще и является неустойчивым: после снятия входных сигналов триггер случайным образом перейдет в одно из своих устойчивых состояний. Вследствие этого, комбинация R = 1 и S = 1 никогда не используется на практике и является запрещенной. Мы рассмотрели простейший RS-триггер. Существуют и другие разновидности этого интересного и полезного устройства. Все они различаются не столько принципом работы, сколько входной логикой, усложняющей «поведение» триггера. Триггеры очень широко применяются в вычислительной технике. На их основе изготовляются всевозможные регистры для хранения и некоторых видов обработки (например, сдвига) двоичной информации, счетчики импульсов и даже интегральные микросхемы статического ОЗУ, не требующие для сохранения информации специальных процессов регенерации. Множество триггеров входят в состав любого микропроцессора.
|
При использовании материала ссылка на сайт Конспекта.Нет обязательна! (0.033 сек.) |