Двоичные коды вычисления. Целочисленные двоичные коды. Знаковые обратные двоичные коды

О двоичной системе и кодах

В цифровой технике передаваемую, принятую или преобразованную информацию выражают набором символов двоичной системы счисления- двоичным кодом.

Любое привычное нам десятичное число может быть представлено как совокупность единиц и нулей этой системы. Десятичное число 7, например, в двоичной системе пишут так: 0111. Здесь крайний левый символ- старший разряд, а крайний правый символ-младший разряд четырехразрядного двоичного кодового числа. Перевод этого двоичного числа в число десятичной системы счисления выполняют в таком порядке: 0111=0X2 3 +1X2 2 +1X2 1 +1Х2 0 =0+4+2+1 =7.

Затем вычисление повторяется до тех пор, пока на рисунке 26 не будет показан полный расчет. Бинарное представление получается путем считывания списка остатков снизу вверх, затем завершается путем помещения наиболее значимых бит в ноль для достижения требуется количество бит.



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

В основе преобразования двоичного числа в десятичное лежит число 2. Сам же код в этом случае называют двоичным натуральным или кодом 8-4-2-1.

Переводить десятичные числа в двоичные и обратно в пределах четырехразрядного кода вам поможет таблица 1.

Таблица 1

Десятичное число Двоичное число
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111

Чтобы прочнее закрепить в памяти принцип кодирования цифровой информации в двоичной системе, предлагаем опытным путем проанализировать работу четырехразрядного двоичного счетчика, собранного, например, на JK-триггерах по схеме, приведенной на рис. 1.

Затем вычисляется дополнение двух, то есть число проходит через младший значащий бит. Мы копируем все биты, пока не упадем на 1, который мы копируем. Все последующие биты инвертируются. Чтобы получить значение двоичного числа, просто используйте бинарные литералы. Можно написать следующие инструкции, которые повторяют два примера рисунков 23 и 24.

Оператор манипуляции бит

Явное преобразование в байтовый тип необходимо для второго числа, потому что преобразование компилятором было безуспешным, поэтому соответствующее целое число равно 212, что в качестве напоминания превышает наибольший представимый байт, равный 127. Эти операторы применимы только к целым числам и приводят к целым числам.


Рис. 1 Четырехразрядный счетчик

Все детали счетчика смонтируйте на макетной панели. К прямым выходам всех триггеров подключите светодиоды или иные индикаторы, по которым можно было бы визуально наблюдать за логическими состояниями триггеров. Функцию источника входных счетных импульсов большой длительности выполняет RS-триггер, собранный на логических элементах 2И-НЕ DD1.1, DD1.2 и управляемый кнопкой SB1.

Во всех семибитных операциях манипуляции, показанных на рисунке. Существует унарный оператор и шесть двоичных файлов. Кроме того, они могут быть разделены на две категории, которые мы сразу увидим: операторы бит-бит и сдвиг. Позволяет им действовать на биты своих операндов, беря их по два на два, что соответствует четырем логическим операторам, которые мы видели ранее.

Это унарный оператор, который будет инвертировать все биты его операнда. Обратите внимание, что эта операция также называется дополнением 1. Вот пример программы, которая использует эти операторы. На рисунке 29 показан результат, рассчитанный этими различными операторами. Для каждого примера вы можете увидеть 8-битовое двоичное представление, так как оно является байтовыми данными.

Заготовьте таблицу (табл. 2), в которую символами двоичной системы счисления будете записывать логические состояния триггеров счетчика импульсов. В крайней левой колонке "Счет"сразу же запишите порядковые номера входных импульсов от 0 до 15. Во второй колонке слева (Q1) записывайте логическое состояние первого триггера при каждом очередном импульсе, в третьей колонке (Q2) - логическое состояние второго триггера и т. д.

Операнды этих операторов должны быть целыми числами. Три бинарных оператора могут использоваться для формирования составного присвоения, как показано в следующем примере. Позволяет им смещать биты целого числа на определенное число позиций влево или вправо. Это сдвиг, а не вращение, т.е. самые правые или левые бит теряются во время смены. Эти три оператора являются двоичными, правый операнд соответствует количеству позиций смещения.

На рис. 30 показаны примеры с использованием этих операторов. Давайте сначала рассмотрим пример в левом верхнем углу. При сдвиге наиболее значимые биты результата соответствуют самому значащему биту левого операнда, так что это смещение со знаком, так как знак результата будет таким же, как и у левого операнда. Также возможно иметь беззнаковый сдвиг вправо, с которым наиболее значимые биты результата всегда заполняются нулями.

Итак, проверьте монтаж, надежность паек и, если ошибок не обнаружите, включите питание. При этом некоторые светодиоды могут загореться, сигнализируя о том, что относящиеся к ним триггеры в момент включения питания оказались в единичном состоянии. Нажмите на кнопку SB2, чтобы. на вход R триггеров подать напряжение низкого уровня и тем самым установить все триггеры счетчика в нулевое состояние. Теперь все индикаторы погасли. Это логическое состояние всех триггеров четырехразрядного счетчика импульсов обозначьте в таблице нулями.

Побитовый оператор как булев оператор




Для этих трех операторов каждый операнд преобразуется отдельно. Тип операнда справа не играет роли в определении типа результата. Они дают одинаковый результат, а именно 20. Аналогично, сдвиг вправо соответствует разбиениям кратных. Побитовые операторы могут использоваться с двумя булевыми операндами. Разница между двоичными и логическими операторами заключается в том, что они не обладают свойством короткого замыкания, то есть оба операнда всегда оцениваются. Теперь мы можем легче понять преобразования целых чисел.

Таблица 2

Счет Q1 Q2 Q3 Q4
0 0 0 0 0
1 1 0 0 0
2 0 1 0 0
3 1 1 0 0
4 0 0 1 0
5 1 0 1 0
6 0 1 1 0
7 1 1 1 0
8 0 0 0 1
9 1 0 0 1
10 0 1 0 1
11 1 1 0 1
12 0 0 1 1
13 1 0 1 1
14 0 1 1 1
15 1 1 1 1

Теперь кратковременно нажмите и отпустите кнопку SB1. При этом RS-триггер переключится из нулевого состояния в единичное сам и напряжением высокого уровня на прямом выходе переключит в такое же состояние первый триггер счетчика. В результате включится светодиод HL1. Остальные триггеры счетчика будут сохранять нулевое состояние, и их светодиоды, естественно, светить не должны.

Хранить несколько булевых данных

В самом деле, во время такого преобразования знак должен быть сохранен. На рисунке 31 показано такое преобразование. Вы видите, что некоторая информация была потеряна: число, представленное, больше не то же самое! Давайте закончим эту главу, увидев практический пример использования операторов манипуляции бит: предположим, что вам нужно восемь булевых в программе. Одним из решений является объявление восьми булевых переменных. Другим решением является использование одной байтовой переменной и использование каждого из своих битов в качестве логического.

Запишите это состояние триггеров в таблицу: в колонку Ql-1, в остальные-0. Нажмите второй раз на кнопку SB1, имитируя второй входной импульс. Сразу же погаснет первый светодиод и включится второй - HL2. Теперь в единичном состоянии оказался второй триггер, а остальные в нулевом. Запишите эти логические состояния триггеров в строку, соответствующую второму входному импульсу.

Третий входной импульс снова установит первый триггер счетчика в единичное состояние и не изменит состояние второго триггера, поэтому будут светить индикаторы HL1 и HL2. В таблице такое состояние счетчика запишите в таком виде: 1100. При четвертом входном импульсе будет светить только светодиод HL3, а в таблице должна появиться запись 0010.

Так, не торопясь, нажимая на кнопку SB1 и считывая по свечению индикаторов состояния триггеров, вы постепенно заполните всю таблицу логических состояний четырехразрядного счетчика. После этого отключите RS-триггер от входа счетчика и подайте на него от генератора последовательность импульсов, следующих с частотой 1...2 Гц. Порядок вспахивания индикаторов, который при такой частоте можно проследить, подтвердит ваши записи, характеризующие работы двоичного четырехразрядного счетчика.

Подведем итоги. Первый триггер вашего опытного счетчика представляет собой младший разряд, а четвертый - старший разряд четырехразрядного счетчика. Соответственно расположены в таблице и колонки символов логических состояний триггеров. Но в двоичной системе символы младших разрядов по отношению к старшим располагают с правой стороны. Поэтому, чтобы по составленной вами таблице определить кодовое состояние счетчика при каждом из пятнадцати входных импульсов, записи в ней следует читать справа налево или предварительно таблицу перевернуть зеркально.

В результате получится: при первом входном импульсе-0001, при втором-0010, при третьем-0011 и т. д. до пятнадцатого импульса, когда кодовое состояние счетчика будет 1111, после чего счет импульсов повторяется. Короче говоря, эта таблица кода состояния счетчика, но, конечно, в перевернутом виде..

Подобные опыты с соответствующими выводами можно, разумеется, провести и с четырехразрядным счетчиком на D-триггерах, соединив их инверсные выходы с входами D, чтобы триггеры работали в счетном режиме. Полезно провести такое исследование и с микросхемой К155ИЕ2. Включив ее по схеме, изображенной на рис. 2, можно составить таблицу кодовых состояний такого счетчика импульсов от 0 до 9.


Рис. 2 Опыт с микросхемой К155ИЕ2

Как вы уже знаете, максимальное десятичное число, которое можно выразить двоичным четырехразрядным кодом,-15. А если это число трехзначное, например, 137? В двоичном коде оно будет выглядеть громоздко и не всегда удобно для переработки: 10001001. Поэтому в цифровой технике, кроме двоичного кода, применяют еще код двоично-десятичный, где каждую цифру десятичного числа представляют в двоичном виде. При двоично-десятичном коде то же трехзначное число 137 имеет такой вид:

А каким образом двоичные или двоично-десятичные кодовые состояния счетчиков импульсов переводят в цифры десятичной системы счисления? Это выполняется с помощью дешифраторов и знакосинтезирующих индикаторов.

Читайте и пишите полезные

Беззнаковые двоичные коды

Первый вид двоичных кодов, который мы рассмотрим - это целые беззнаковые коды. Для определённости примем длину слова процессора равной восьми битам. В этих кодах каждый двоичный разряд представляет собой степень цифры 2:

При этом минимально возможное число, которое можно записать таким двоичным кодом, равно 0. Максимально возможное число, которое можно записать таким двоичным кодом, можно определить как:

Этими двумя числами полностью можно определить диапазон, чисел которые можно представить таким двоичным кодом. В случае двоичного восьмиразрядного беззнакового целого числа диапазон будет: диапазон чисел, которые можно записать таким кодом: 0 .. 255. Для шестнадцатиразрядного кода этот 0 .. 65535. В восьмиразрядном процессоре для хранения такого числа используется две ячейки памяти, расположенные в соседних адресах. Для работы с такими числами используются специальные команды.

Прямые знаковые двоичные коды

Второй вид двоичных кодов, который мы рассмотрим - это прямые целые знаковые коды. В этих кодах старший разряд в слове используется для представления знака числа. В прямом знаковом коде нулем обозначается знак "+", а единицей - знак "-". В результате введения знакового разряда диапазон чисел смещается в сторону отрицательных чисел:


В случае двоичного восьмиразрядного знакового целого числа диапазон чисел, которые можно записать таким кодом: -127 .. +127. Для шестнадцатиразрядного кода этот диапазон будет: -32767 .. +32767. В восьмиразрядном процессоре для хранения такого числа тоже используется две ячейки памяти, расположенные в соседних адресах.

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

Знаковые обратные двоичные коды.

Обратные двоичные коды отличаются от прямых только тем, что отрицательные числа в них получаются инвертированием всех разрядов числа. При этом знаковый и цифровые разряды не различаются. Алгоритм работы с такими кодами резко упрощается.


Тем не менее при работе с обратными кодами требуется специальный алгоритм распознавания знака, вычисления абсолютного значения числа, восстановления знака результата числа. Кроме того, в прямом и обратном коде числа для запоминания числа 0 используется два кода, тогда как известно, что число 0 положительное и отрицательным не может быть никогда.

Знаковые дополнительные двоичные коды.

От перечисленных недостатков свободны дополнительные коды. Эти коды позволяют непосредственно суммировать положительные и отрицательные числа не анализируя знаковый разряд и при этом получать правильный результат. Все это становится возможным благодаря тому, что дополнительные числа являются естественным кольцом чисел, а не исскуственным образованием как прямые и обратные коды. Кроме того немаловажным является то, что вычислять дополнение в двоичном коде чрезвычайно легко. Для этого достаточно к обратному коду добавить 1:


Диапазон чисел, которые можно записать таким кодом: -128 .. +127. Для шестнадцатиразрядного кода этот диапазон будет: -32768 .. +32767. В восьмиразрядном процессоре для хранения такого числа используется две ячейки памяти, расположенные в соседних адресах.

В обратных и дополнительных кодах наблюдается интересный эффект, который называется эффект распространения знака. Он заключается в том, что при преобразовании однобайтного числа в двухбайтное достаточно всем битам старшего байта присвоить значение знакового бита младшего байта. То есть для хранения знака числа можно использовать сколько угодно старших бит. При этом значение кода совершенно не изменяется.

Использование для представления знака числа двух бит предоставляет интересную возможность контролировать переполнения при выполнении арифметических операций. Рассмотрим несколько примеров.

1) Просуммируем числа 12 и 5

В этом примере видно, что в результате суммирования получается правильный результат. Это можно проконтролировать по флагу переноса C, который совпадает со знаком результата (действует эффект распространения знака).

2) Просуммируем два отрицательных числа -12 и -5

В этом примере флаг переноса C тоже совпадает со знаком результата, то есть переполнения не произошло и в этом случае

3) Просуммируем положительное и отрицательное число -12 и +5

В этом примере при суммировании положительного и отрицательного числа автоматически получается правильный знак результата. В данном случае знак результата отрицательный. Флаг переноса совпадает со знаком результата, поэтому переполнения не было (мы можем убедиться в этом непосредственными вычислениями на бумаге или на калькуляторе).

4) Просуммируем положительное и отрицательное число +12 и -5

В данном примере знак результата положительный. Флаг переноса совпадает со знаком результата, поэтому переполнения не было и в этом случае.

5)Просуммируем числа 100 и 31

В этом примере видно, что в результате суммирования произошло переполнение восьмибитовой переменной, т.к. в результате операции над положительными числами получился отрицательный результат. Однако если рассмотреть флаг переноса, то он не совпадает со знаком результата. Эта ситуации является признаком переполнения результата и легко обнаруживается при помощи операции "исключающее ИЛИ" над старшим битом результата и флагом переноса C. Большинство процессоров осуществляют эту операцию аппаратно и помещают результат во флаг переполнения OV.

В этом примере результате операции над отрицательными числами в результате суммирования произошло переполнение восьмибитовой переменной, т.к. получился положительный результат. И в этом случае если рассмотреть флаг переноса C, то он не совпадает со знаком результата. Отличие от предыдущего случая только в комбинации этих бит. В примере 5 говорят о переполнении результата (комбинация 01), а в примере 6 об антипереполнении результата (комбинация 10).

Литература:

Другие виды двоичных кодов:

Иногда бывает удобно хранить числа в памяти процессора в десятичном виде
http://сайт/proc/DecCod.php

Стандартные форматы чисел с плавающей запятой для компьютеров и микроконтроллеров
http://сайт/proc/float/

Представление текстов в памяти компьютеров и микроконтроллеров
http://сайт/proc/text.php

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



glavpom.ru - Подстанции. Силовая электроника. Экология. Электротехника