стандартный C с плавающей запятой для пользовательского представления с плавающей запятой с использованием 32-разрядных целых и побитовых операторов?

#c #bit-manipulation #bitwise-operators #floating #ieee

#c #битовые манипуляции #побитовые операторы #плавающий #ieee

Вопрос:

Я пытаюсь написать небольшую программу для преобразования C float в 12-разрядное представление с плавающей запятой с использованием 32-разрядных целых и побитовых операторов.

Порядок идет: [неиспользуемый (биты 31-12)] [знак (бит 11)] [exp (биты 10 — 6)] [frac (биты с 5 по 0)]

 [ ..., ..., ...] [] [][][][][] [][][][][][]
 

Я использую только 12 Л.С.Б. для этого представления.

Например,

используя стандарт IEEE, число с плавающей запятой 7.375 в двоичном формате равно: 111.011

В научной нотации: 1.11011×2 ^ 2

смещение = 2 ^ (e-1) -1 = 15

E = 2

exp = E смещение = 17 = 10001

Поэтому я хотел бы сохранить представление с плавающей запятой в целом числе следующим образом:

 [... unused (bits 31 - 12 set to 0) ...]-[0]-[1][0][0][0][1]-[1][1][0][1][1][0]
 

Я могу выполнить преобразование вручную, но я пытаюсь выполнить это с помощью битовых операций. Я думаю, где я застрял, как бы я выполнил предполагаемое смещение десятичной точки в программе, чтобы получить фрагментную часть представления? Кроме того, как я узнаю значение E?

Комментарии:

1. Вы просматривали документацию IEEE float s? Вы можете понять это, разделив float сквозное a union с a struct битовых полей. Однако это поведение определяется реализацией, см. Приложение J.3.9 стандарта.

2. Я специально пытаюсь сделать это без объединения и структуры битовых полей. Я просто пытаюсь выяснить, как получить части frac и E с плавающей запятой. Чтобы узнать E при выполнении этого вручную, я должен сдвинуть десятичную дробь на 1 место меньше, чем MSB. Если я сдвину целое число с плавающей запятой, используя побитовые операции, будет ли это иметь тот же эффект, что и сдвиг десятичной точки?

3. Пожалуйста, возьмите хорошую книгу по C или даже стандарт и посмотрите главу о выражениях. Вы обнаружите, что побитовый сдвиг и логические операторы работают только с целыми числами. Почему вы не хотите использовать union and struct ?