- •Оглавление
- •Представление чисел в памяти эвм
- •Представление беззнаковых целых чисел в памяти эвм
- •Обратный код
- •Пример 1.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Важное следствие (пример 2).
- •Представление вещественных типов в памяти эвм
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 4
- •Алгоритмы работы с числами, которые представлены строкой
- •Сложение положительных чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
- •Реализация алгоритма на Pascal
- •Умножение двух положительных целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Сравнение двух целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Вычитание целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Реализация алгоритмов работы с целыми числами, представленными в виде строки на c#
Пример 4
Найти представление числа 139,76 в форме с плавающей запятой, если это 4х байтовое число и под порядок отводится 9 бит
Это тип Single. Т.к. он занимает 4 байта, то это 32 бита. Поэтому в общем виде ответ будет выглядеть:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Так как число положительное, то в первом бите будет 0. Поэтому следующий шаг к ответу будет
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Переведем число 139,76 в двоичную систему.
139,7610 = 10001011,11000010100011112
Пронормируем полученное число
10001011,11000010100011112=1,000101111000010100011112*27
Порядок равен 710=1112. Под него отведено 9 бит, то смещение будет равно 011111111. Поэтому в порядок запишется (0111111112+1112=100000010). Поэтому следующий шаг к ответу будет
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Мантисса у нашего числа получилась 1.000101111000010100011112. Откинем первую единицу, получим .000101111000010100011112. Однако эти число получилось больше, чем 22 разряда. Поэтому необходимо откинуть последнюю единицу (из-за этого появляется погрешность при представлении числа в памяти ЭВМ). Поэтому ответ будет
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
Для удобства запишем в 16ричной системе: 4085E14716.
Если машина старшеконечная, то в памяти ЭВМ это число будет располагаться 47E1854016
Представление числа «0» в памяти ЭВМ.
Число 0 – исключение из правил, потому что у него нет значащей единицы. Поэтому его представление в памяти ЭВМ – все 0. Т.е. в 16ричной системе для 4х байтового числа с плавающей запятой это будет 0000000016.
Общий алгоритм сложения (или вычитания) чисел с плавающей точкой
Алгоритм сложения (или вычитания) чисел с плавающей точкой следующий:
Если у чисел разные порядки, то сдвигать вправо число с меньшим порядком до тех пор, пока порядки не станут равными.
Сложить (или вычисть) мантиссы.
Если надо, то пронормировать результат. Учитывать, что при нормировке измениться порядок числа.
Пример 1
Сложить 2 числа с плавающей точкой. Числа равны 3.25 и 0.375. Для каждого числа отводится 4 байта, 9 бит отводится под порядок.
Решение:
Из предыдущих примеров возьмем представление этих числе в памяти ЭВМ.
3.25
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0.375
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Как видим, эти 2 числа имею различный порядок. Для того, что бы их можно было складывать, необходимо приравнять порядки. При этом надо сдвигать число с меньшим порядком вправо. Очевидно, что разность между порядками равна 3, т.е. нам надо сдвигать на 3 разряда вправо второе число. При этом надо при первом сдвиге надо не забыть о «отброшенной» первой знаковой единице.
Сдвинем число последовательно по 1 разряду 3 раза. Получим
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Таким образом, мы получили
3.25 (с «отброшенной единицей»)
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0.375 (без «отброшенной единицы»)
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Теперь можно сложить мантиссы. Получим
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Важно отметить, что у нас не было переполнения мантиссы, т.е. не надо нормировать результат сложения мантисс. Для удобства запишем число в 16ричной системе: 4014000016.
Важное следствие:
Если порядки сильно отличаются, то второе число может быть просто «отброшено».
Пример 2
Вычисть из 3.75 число 3.25, если это числа с плавающей точкой. Для каждого числа отводится 4 байта, 9 бит отводится под порядок.
Решение:
Из предыдущих примеров возьмем представление этих числе в памяти ЭВМ.
0.375
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
3.25
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Как видим, эти 2 числа имеют одинаковый порядок. Поэтому ни одно из них не надо сдвигать. Поэтому можно сразу вычитать мантиссы. Но при этом нельзя забывать об «отброшенной» единице. Поэтому для удобства запишем мантиссы с «отброшенной» единицей.
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
И произведем вычитание. Получим
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Как видим, в мантиссе первая цифра – не «1». Поэтому необходимо полученное число сдвигать влево до тех пор, пока в первом бите не будет 1. (общеизвестно, что сдвиг влево в двоичной системе – это умножение на 2. Поэтому при сдвиге влево порядок будет уменьшаться. А при сдвиге вправо – порядок будет увеличиваться). Очевидно, что надо сдвинуть на 2 разряда влево, что бы единица стала первой значащей цифрой.
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Теперь можно откинуть первую значащую единицу
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
И записать порядок, предварительно уменьшив его на 2, т.е. на 102. 1000000002-102=0111111012.
Очевидно, что при вычитании знак числа не поменялся, поэтому в старшем бите будет 0.
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Для удобства запишем в 16ричной системе:3F40000016