Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Битовая логика.docx
Скачиваний:
2
Добавлен:
11.07.2019
Размер:
122.24 Кб
Скачать

Пример 5.

Перевести -1000 в дополнительный код, если это двухбайтовое знаковое число.

Решение.

Т.к. это двухбайтовая величина, то для него отводится 16 разрядов. Поэтому ответ будет вида ХХХХ ХХХХ XXXX XXXX.

Т.к. -1000 – отрицательное число, то старший бит будет равен 1. Поэтому ответ будет вида 1ХХХ ХХХХ XXXX XXXX, т.е. у нас «осталось» 15 бит для числа.

Переведем 1000 в двоичную систему.

100010=11 1110 10002

Дополним спереди нулями до 15 разрядов

100010=11 1110 10002 = 000 0011 1110 10002

Т.к. это число отрицательное, то все биты в числе 1000 необходимо инвертировать

000 0011 1110 10002

111 1100 0001 01112

После этого прибавим к полученному числу 1. Получиться 111 1100 0001 10002.

Теперь «склеим» знаковый бит (1) и полученное число (111 1100 0001 10002). Получим 1111 1100 0001 10002. Для удобства записи запишем в 16ричной системе. FС1816.

В старшеконечной машине число будет 18FС16

В младшеконечной машине число будет FC1816.

Преобразование из машинного представления в десятичную систему

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

Пример 1.

Найти десятичное значение числа AF0416, если это двухбайтовый знаковый тип и старшеконечная машина.

Решение.

Т.к. машина старшеконечная, то это число 04AF16. Переведем это число в двоичную систему

04AF16=0000 0100 1010 11112.

Как видно, старший бит равен 0. Поэтому это положительное число. Т.к. это число положительное, то не надо инвертировать биты. Поэтому достаточно просто перевести 0000 0100 1010 11112 в десятичную систему. Это будет число 1199.

Ответ: +1199

Пример 2.

Найти десятичное значение числа AFA416, если это двухбайтовый знаковый тип и старшеконечная машина

Решение.

Т.к. машина старшеконечная, то это число A4AF16. Переведем это число в двоичную систему

A4AF16=1010 0100 1010 11112.

Как видно, старший бит равен 1. Поэтому это число отрицательное.

Для того, что бы получить модуль значения, необходимо в начале отнять 1.

010 0100 1010 11112-12=010 0100 1010 11102

Потом необходимо инвертировать все биты

010 0100 1010 11102

101 1011 0101 00012

Потом необходимо перевести 101 1011 0101 00012 в десятичную систему. Это 23377.

Ответ: -23377

Пример 3.

Найти десятичное значение числа AF16, если это однобайтовый знаковый тип.

Решение

Переведем это число в двоичную систему

AF16=1010 11112.

Как видно, старший бит равен 1. Поэтому это число отрицательное.

Для того, что бы получить модуль значения, необходимо в начале отнять 1.

010 11112-12=010 11102

Потом необходимо инвертировать все биты

010 11102

101 00012

Потом необходимо 101 00012 перевести в десятичную систему. Это число 81.

Ответ: -81

Важное следствие (пример 1).

Очень часто в программировании возникает необходимость в преобразовании чисел одного типа в другой. Если мы преобразуем из менее точного (или менее большого) в более точный (или более большой), то сложностей не возникает.

Например

var

a : byte;

begin

clrscr;

a := 21;

write(integer(a));

readkey;

end.

Очевидно, что в данном случае пользователь увидит на экране «21», потому что мы преобразуем из меньшего типа (byte, который занимает 1 байт) в больший (integer, который занимает 2 байта).

Но что увидит пользователь, если мы чуть изменим программу?

var

a : integer;

begin

clrscr;

a := 12198;

write(byte(a));

readkey;

end.

Очевидно, что число 12198 не укладывается в диапазон типа byte. Для того, что бы ответить на вопрос, необходимо получить внутренне представление числа 12198.

Это число положительное, двухбайтовое, поэтому оно будет занимать 16 бит, старший бит равен 0. 1219810=10 1111 1010 01102. Дополним до 15 бит и «склеим» со знаковым битом. Получим 0010 1111 1010 01102. Для удобства запишем в 16ричной системе. Получим 2FA616.

Если машина старшеконечная, то в памяти эти 2 байта будут располагаться в обратном порядке, т.е. A62F16.

При преобразовании в однобайтовый тип (byte) будет взят только первый байт, т.е. A616. Т.к. byte – беззнаковый тип, то для получения ответа необходимо просто перевести A616 в десятичную систему. Получим 166.

Ответ: 166