Russian Qt Forum
Ноябрь 26, 2024, 18:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Преобразовать quint32 во float сохраняя двоичное представление  (Прочитано 8830 раз)
Susenin
Новичок

Offline Offline

Сообщений: 35


Просмотр профиля
« : Октябрь 04, 2013, 23:45 »

Здравствуйте.
Как средствами Qt преобразовать unsigned int во float c сохранением двоичного представления данных? Т.е из unsigned int со значением 1078984704 сделать float значением 3.25.
Это можно сделать с помощью union, но вдруг есть нативный Qt способ?

Может лыжи не едут, но у меня не получилось ни с помощью QVariant, ни с помощью QDataStream (что очень странно).
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Октябрь 05, 2013, 07:10 »

Код
C++ (Qt)
   quint32 i = 1078984704;
   float f;
   memcpy(&f, &i, sizeof(float));
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Октябрь 05, 2013, 08:47 »

Это можно сделать с помощью union, но вдруг есть нативный Qt способ?
union нативный способ C (и по наследству C++), нет никакой необходимости в каких-то способах Qt.
« Последнее редактирование: Октябрь 05, 2013, 08:59 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 05, 2013, 09:03 »

union лучше но можно и так
Код
C++ (Qt)
float f = *(float *) &i;
И повеяло чем-то родным  Улыбающийся Кстати ноль одинаков, что бывает удобно
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Октябрь 05, 2013, 09:37 »

Код
C++ (Qt)
float f = *(float *) &i;
И это же на C++
Код
C++ (Qt)
float &f = reinterpret_cast<float&>( i );
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Октябрь 05, 2013, 10:56 »

Мой вариант без варнингов. Показает язык
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Октябрь 05, 2013, 11:09 »

Код
C++ (Qt)
float f = *(float *) &i;
Код
C++ (Qt)
memcpy(&f, &i, sizeof(float));
Есть вероятность, что на платформах, где sizeof(int) < sizeof(float), будет "погода в Африке".
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Susenin
Новичок

Offline Offline

Сообщений: 35


Просмотр профиля
« Ответ #7 : Октябрь 05, 2013, 11:25 »

Всем спасибо!
reinterpret_cast (как для меня оказывается  Улыбающийся ) как раз и предназначен для сохранения bit pattern.
А то, что sizeof(float) может быть != sizeof(unsigned int), как обычно, пусть заботятся следующие поколения поддерживающим мою программу.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Октябрь 05, 2013, 11:32 »

А то, что sizeof(float) может быть != sizeof(unsigned int), как обычно, пусть заботятся следующие поколения поддерживающим мою программу.
Ну ыв им ассертов не забудьте наставить. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Октябрь 05, 2013, 11:58 »

Мой вариант без варнингов. Показает язык
Как и все остальные (вспоминается "без холестерина" на этикетке  Улыбающийся)

Есть вероятность, что на платформах, где sizeof(int) < sizeof(float), будет "погода в Африке".
Явный перегиб м фобия мифической платформы. Впрочем если таковая появится, академичность не спасет.

Да и вообще, люди давно используют 2-байтовые флоты, и все хорошо
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Октябрь 05, 2013, 13:39 »

Как и все остальные
MinGW ругается: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Октябрь 05, 2013, 13:47 »

MinGW ругается: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
Это на какой вариант?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #12 : Октябрь 05, 2013, 16:03 »

На оба варианта и reinterpret_cast и на c-style cast предупреждение одинаковое.

Что ожидаемо с промежуточным void* позволяет кастовать без предупреждений:
Код
C++ (Qt)
   quint32 i = 1078984704;
   float f;
   void* v = static_cast< void* >( &i );
   f = *static_cast< float* >( v );
Но вот стоит «сократить» запись, как опять тот же варнинг:
Код
C++ (Qt)
   quint32 i = 1078984704;
   float f;
   f = *static_cast< float* >( static_cast< void* >( &i ) );

P.S. Да, я понимаю, что писать без варнингов не самоцель.
« Последнее редактирование: Октябрь 05, 2013, 16:18 от LisandreL » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Октябрь 05, 2013, 16:19 »

На оба варианта и reinterpret_cast и на c-style cast предупреждение одинаковое.
Странно, а ключи какие используете при компиляции? И версия компилятора какая?
У меня ни звука не издает, ни с моим вариантом, ни с вашими.
g++ (GCC) 4.8.1 20130725 (prerelease)
« Последнее редактирование: Октябрь 05, 2013, 16:44 от Old » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #14 : Октябрь 05, 2013, 16:56 »

Явный перегиб м фобия мифической платформы. Впрочем если таковая появится, академичность не спасет.
Зачем оттягивать ветку идущему следом за тобой?
Кто мешает сделать примерно так:
Код:
    void* ptr = calloc(1, std::max(sizeof(int),sizeof(float)));
    memcpy(ptr, &i, sizeof(int));
    f = *(float *) ptr;
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.335 секунд. Запросов: 23.