#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
сквозное aunion
с astruct
битовых полей. Однако это поведение определяется реализацией, см. Приложение J.3.9 стандарта.2. Я специально пытаюсь сделать это без объединения и структуры битовых полей. Я просто пытаюсь выяснить, как получить части frac и E с плавающей запятой. Чтобы узнать E при выполнении этого вручную, я должен сдвинуть десятичную дробь на 1 место меньше, чем MSB. Если я сдвину целое число с плавающей запятой, используя побитовые операции, будет ли это иметь тот же эффект, что и сдвиг десятичной точки?
3. Пожалуйста, возьмите хорошую книгу по C или даже стандарт и посмотрите главу о выражениях. Вы обнаружите, что побитовый сдвиг и логические операторы работают только с целыми числами. Почему вы не хотите использовать
union
andstruct
?