- •Оглавление
- •Представление чисел в памяти эвм
- •Представление беззнаковых целых чисел в памяти эвм
- •Обратный код
- •Пример 1.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Важное следствие (пример 2).
- •Представление вещественных типов в памяти эвм
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 4
- •Алгоритмы работы с числами, которые представлены строкой
- •Сложение положительных чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
- •Реализация алгоритма на Pascal
- •Умножение двух положительных целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Сравнение двух целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Вычитание целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Реализация алгоритмов работы с целыми числами, представленными в виде строки на c#
Важное следствие (пример 2).
Но что увидит пользователь, если мы чуть изменим программу?
var
a : integer;
begin
clrscr;
a := 12198;
write(shortint(a));
readkey;
end.
Очевидно, что число 12198 не укладывается в диапазон типа shortint. Для того, что бы ответить на вопрос, необходимо получить внутренне представление числа 12198. Возьмем его из предыдущего примера - 2FA616.
Если машина старшеконечная, то в памяти эти 2 байта будут располагаться в обратном порядке, т.е. A62F16.
При преобразовании в однобайтовый тип (shortint) будет взят только первый байт, т.е. A616.
Переведем это число в двоичную систему. A616=1010 01102.
Очевидно, что shortint – знаковый тип, и старший бит равен 1. Поэтому это число отрицательное.
Для того, что бы получить модуль этого числа, необходимо в начале вычесть единицу (естественно знаковый бит отбрасывается при получении модуля). 010 01102-12=010 01012
Теперь необходимо инвертировать все биты.
Получим
010 01012
101 10102
Теперь переведем 101 10102 в десятичную систему. Получим 90.
Ответ: -90.
Представление вещественных типов в памяти эвм
Для начала вспомним, что такое нормальная форма десятичного числа.
Нормальная форма в общем виде выражается следующим образом:
R=m×pn, где m – мантисса, p – основание системы счисления, n – порядок.
Приведем пару примеров нормировки чисел
-
число
нормированное число
456
4,56*102
0,02
2*10-2
123,02
1,2302*102
100
1*102
1
1*100
Для объяснения внутреннего представления чисел приведем аналогичные рассуждения, наложив ограничения:
Ограничение 1: первая значащая цифра в нормированном числе всегда «1».
Пример 1
Путь у нас есть нормированное число: 1,56*10-2, которое надо представить в 16 ячейках, одна из которых отведена под знак, 10 ячеек отведены под мантиссу, 5 ячеек отведены под порядок.
В общем виде результат представления равен
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
Синим цветом выделены разряды для мантиссы, зеленым цветом выделены разряды для порядка.
Так же как и для целых знаковых чисел, в первом разряде храниться «1», если число отрицательное и «0», если число положительное. Поэтому следующий шаг к ответу будет
0 |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
Теперь нам надо записать мантиссу в 10 разрядов. Поэтому дополним число 1,56 незначащими нулями до 10 разрядов: 1,560000000.
Так как у нас есть ограничение 1, то мы можем «отбросить» первую единицу, потому что она у нас всегда там есть (замечание: единственное исключение – число 0. Оно в памяти ЭВМ представляется исключительно). Т.к. мы отбросили «1» в начале, то допишем еще один незначащий ноль в конце и запишем в соответствующие разряды.
0 |
X |
X |
X |
X |
X |
5 |
6 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Теперь нам надо записать порядок в 5 разрядов. Но проблема заключается в том, что он равен P = -2, т.е. знаковому числу. Поэтому принято смещать порядок относительно 0, т.е. записывают не P, а P + 10000 (09999 взято для примера. Необходимо 5 цифр, потому что отведено 4 разряда, и первый незначащий 0). Поэтому в разряды порядка попадет число (-2 + 09999 = 09997)
0 |
0 |
9 |
9 |
9 |
7 |
5 |
6 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Мы получили число, которое храниться по принципам, аналогичным принципам хранения чисел с плавающей запятой.