![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
kiLLProg |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Здравствуйте. Пишу программу на чистом Си. Есть структура, которая описывает представление в памяти ЭВМ дробное число float по стандарту IEEE 754.
На выходе значение будет: 3.14 А вот когда байты дробного числа (точнее, байты представления дробн. числа в памяти ЭВМ) содержатся в переменной типа int (0x4048F5C3), то у меня не получатся правильно вытащить их. Точнее сказать, я не могу вытащить мантиссу. С вытаскиванием знака и порядка я вроде справился.
А вот с мантиссой проблемы. Мне нужны только 23 бита из 24х (24 бита = 3 байта (48F5C3)). 48F5C3 = 10010001111010111000011 (23 бита) + еще один ноль появится, когда это число, например, по массиву раскидаем. И этот ноль мне не нужен. Вот как я понимаю свою проблему. Пробовал делать так.
На выходе левое число. Подскажите пожалуйста как мне записать в битовое поле m, ровно 23 бита из переменной int a = 0x48F5C3? Буду очень благодарен. |
||||||
|
|||||||
baldina |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
i
|
||||||||
|
|||||||||
kiLLProg |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Так пробовал. Не получается.
Так то же не правильный результат. Но когда я экспериментировал с этим кодом. Я случайно в одной строке написал бессмысленное значение.
Не посмотрев, откомпилировал код, и вуаля! Правильное значение (3.14). Почему так происходит я ХЗ, но это интересный пример для рассмотрения. Я не долго радовался. Когда значение переменой записано вручную int a = 0x48F5C3, то в структуру можно сразу записать так pf.f.m = a. На самом деле переменная будет выглядеть так a = 0x48F5C300, после сшивания из отдельных байтов. Прошу меня извинить, я затупил чуток. Нужно было ровно 23 бита вытащить не из 0x48F5C3, а из 0x48F5C300. Т.к. в 4х байтовом int будет пустовать один байт всегда. А вот эти нули как раз не нужны. Вот я и обломался когда в х вбил 0x48F5C300 прогнал программу (2) и получил левое значение. Решение проблемы оказалось простое как три бакса ![]() 0048F5C3=10010001111010111000011 - Нет лишних нулей!!! Ровно 23 нужных бита ![]() ![]() ![]() Как я раньше только не измывался над компилятором. Какие я только способы выуживания битов не перепробовал. Короче код программы.
Вот и всё! ![]() ![]() ![]() Использованные статьи: Интернет калькулятор Работа с битами Отсюда взял структуру И многие другие. Мне до сих пор интересно. Как из x = 0x48F5C300 вытащить только 23 бита? Это сообщение отредактировал(а) kiLLProg - 16.4.2011, 09:41 |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |