двоичная арифметика

Модератор: Модераторы разделов

skillergti
Сообщения: 34
ОС: slackware

двоичная арифметика

Сообщение skillergti »

Здравствуйте.
Пытаюсь выполнить цикл задачек для процессора VAX-11.
В процессе выполнения заступорился на следующем пункте:
даны числа, требуется перевести их в формат с плавающей точкой (нормированная форма, с беззнаковым порядком).
Формат F (32 бита: 1й бит - знак числа, 8 следующих - характеристика, 23 остальных - мантисса (со скрытым битом)).
Формат D (64 бита: порядок 8, мантисса 55);
Формат G (64 бита: порядок 11, мантисса 52);
Формат H (128 бита: порядок 15, мантисса 112);
Характеристика - постоянное смещение + порядок

Не понимаю как вычислить мантиссу и порядок.
Я должен взять десятичное число по модулю, перевести его в двоичную форму (установив (как?) в нужном месте запятую), затем вычислять характеристику отсносительно этого числа, либо надо сразу десятичное число перевести в формат с плавающей точкой а затем как-то преобразовывать порядок и основание, либо как-то ещё?

Как пример, число -1100753141760000, в шестнадцатиричном представлении FF182DBDE0000000 (long word).

Гугл пробовал, читал, пытался понять, но только запутался.
Очень прошу помочь.
Заранее спасибо.
Спасибо сказали:
Аватара пользователя
--=Civil696=--
Сообщения: 227
ОС: Gentoo o_O

Re: двоичная арифметика

Сообщение --=Civil696=-- »

skillergti писал(а):
29.11.2008 15:13
Формат F (32 бита: 1й бит - знак числа, 8 следующих - характеристика, 23 остальных - мантисса (со скрытым битом)).
....
Не понимаю как вычислить мантиссу и порядок.
Ну если на листе бумаги делать, то приблизительно вот так:

на примере 5.75

переведём в двоичный вид 101.11

мантисса (значащая часть числа) 10111

т.к. числа в ячейку записывают в нормализованном виде (т.е первая цифра в числе всегда единица например число 0011 после нормализации 11) и все числа начинаются с единицы, первую единицу просто не пишут, мысленно мы можем представить что она находится на месте последнего бита в разряде, поэтому выглядеть наше число будет примерно так:

Код: Выделить всё

[1 бит знак][разряд занимающий 8 бит]01110..все_нули

теперь про разряд

если разряд равен 10000000
то запятая стоит после второго символа
т.е число имеет вид 10.111
если разряд больше (меньше) 10000000 то запятая сдвигается в право (в лево) на разность между 10000000 и нашим разрядом

например
чило с мантиссой: 1001
при разряде 10000000
выглядит как 10.01
при разряде 01111100

Код: Выделить всё

_10000000
-01111100
-------------
_00000100

сдвигаем запятую на 4 знака влево
получаем 0.001001


нам надо превратить 10.111 в 101.11 т.е сдвинуть запятую на 1 знак вправо
просто прибавим единичку к разряду 10000000 получим 10000001 это и будет наш разряд

в ячейке это будет выглядеть как
[0][10000001][01110....0]

первая цифра - знак (0 плюс 1 минус)
восемь цифр - далее порядок
далее - мантисса из которой выкинули первую единичку (10111) и дописали незначащими нулями до конца ячейки

теперь просто группируем цифры, в получившемся числе, по 4 штуки и записываем эквивалентные им шестнадцатеричные цифры
[0100][0000][1011][1000][0....0]
40B80...0
т.е шестнадцатеричный дамп десятичного числа 5.75 в 4-х байтовой ячейке 40B80000
НЕ ПАНИКУЙ © ^_~
Спасибо сказали:
skillergti
Сообщения: 34
ОС: slackware

Re: двоичная арифметика

Сообщение skillergti »

всё понял, большое спасибо
Спасибо сказали: