2014-01-10 4 views
-1

Мне было предложено поработать над следующим вопросом со следующей спецификацией/правилами:
Номера хранятся в 16 бит, разделенных слева направо, следующим образом:
1-значный знак знака, который должен быть установлен для отрицательного номера и в противном случае ясно.
7 бит показатель проводится в Excess 63
8 бит мантиссы, нормированная на 1.x только дробной части сохраняются - как в стандарте IEEE 754
Давать ответы в шестнадцатеричном формате, как бы число -18 будет представлено в этой системе ?десятичная система с плавающей запятой.

ответ получил это: 11000011 00100000 (или C320 в шестнадцатеричной)
, используя следующий метод:
-18 десятичного является отрицательным числом, поэтому мы знаковый бит установлен в 1.
18 в двоичной системе будет be 0010010. Это мы можем отметить как 10010. Мы знаем, что работает с правой частью десятичной точки, но в этом случае у нас нет десятичной точки или фракций, поэтому мы отмечаем 0000 0000, так как нет фракций. Теперь мы записываем двоичный код из 18 и оставшиеся нули (которые необязательно требуются) и разделяем их на десятичную точку, как показано ниже:
10010.00000000
Теперь мы нормализуем это в форме 1.x, перемещая десятичную точку и помещая его между первым и вторым числом (считая количество раз, когда мы перемещаем десятичную точку до тех пор, пока она не достигнет этой области). Результат теперь равен 1.001000000000 x 2^4, и мы также знаем, что десятичная точка была перемещена в 4 раза, и теперь мы будем считать нашим показателем экспоненты. Используемая нами система с плавающей запятой имеет 7-битный показатель и использует избыток 63. Показатель 4 в избытке 63, который будет равен 63 + 4 = 67, и это в 7-битном двоичном выражении отображается как 1000011.
Битовый бит: 1 (-ve)
Экспонент: 1000011
мантисса является 00100 ...
двоичное представление: 11000011 00100000 (или C320 в шестнадцатеричной)

пожалуйста, дайте мне знать, если это правильно или, если я сделал это неправильно и какие изменения могут быть применены. спасибо парню :)

+1

Это похоже на один из ваших предыдущих вопросов http://stackoverflow.com/questions/21029217/decimal-to-floating-point-conversion-using-16-bit. –

+0

Не знаете, почему кто-то голосует за вопрос. Я только пытался подтвердить, был ли мой ответ правильным, что на самом деле было. Не нужно быть отрицательным. – ComputerScienceStudent

ответ

1

Поскольку вам, похоже, задано много вопросов этого типа, может быть полезно написать автоматическую проверку ответа, чтобы подтвердить вашу работу. Я соединил быстрый конвертер в Python:

def convert_from_system(x): 

    #retrieve the first eight bits, and add a ninth bit to the left. This bit is the 1 in "1.x". 
    significand = (x & 0b11111111) | 0b100000000 
    #retrieve the next seven bits 
    exponent = (x >> 8) & 0b1111111 
    #retrieve the final bit, and determine the sign 
    sign = -1 if x >> 15 else 1 

    #add the excess exponent 
    exponent = exponent - 63 

    #multiply the significand by 2^8 to turn it from 1.xxxxxxxx into 1xxxxxxxx, then divide by 2^exponent to get back the decimal value. 
    result = sign * (significand/float(2**(8-exponent))) 
    return result 

for value in [0x4268, 0xC320]: 
    print "The decimal value of {} is {}".format(hex(value), convert_from_system(value)) 

Результат:

The decimal value of 0x4268 is 11.25 
The decimal value of 0xc320 is -18.0 

Это подтверждает, что делает -18 конвертировать в 0xC320.

Смежные вопросы