- •Оглавление
- •Представление чисел в памяти эвм
- •Представление беззнаковых целых чисел в памяти эвм
- •Обратный код
- •Пример 1.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Важное следствие (пример 2).
- •Представление вещественных типов в памяти эвм
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 4
- •Алгоритмы работы с числами, которые представлены строкой
- •Сложение положительных чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
- •Реализация алгоритма на Pascal
- •Умножение двух положительных целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Сравнение двух целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Вычитание целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Реализация алгоритмов работы с целыми числами, представленными в виде строки на c#
Пример 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