MyTetra Share
Делитесь знаниями!
Как получить битовое представление float-числа в виде int?
Время создания: 16.01.2024 15:16
Текстовые метки: язык, C, Си, C++, Си++, reinterpret_cast, преобразование, тип, представление, float, int, преобразование, приведение, получение, адрес, указатель
Раздел: Компьютер - Программирование - Язык C (Си)
Запись: xintrea/mytetra_syncro/master/base/1705407412gm8qnuwl2g/text.html на raw.github.com

Через reinterpret_cast


Если есть число с плавающей точкой в виде типа float, то битовое представление в виде беззнакового int-числа можно получить через reinterpret_cast следующием кодом:



uint32_t i = *reinterpret_cast<uint32_t*>(&f);



В C-стиле


Так же можно вообще воспользоваться c-style кодом:



uint32_t i = *(uint32_t*)&f;



Кстати, данный код активно использовался в Quake III.


Однако, эти два метода - это Undefined Behaviour (UB), хотя бы потому, что не на всех платформах int и float имеют один и тот же размер, а так же порядок байтов может быть как LE так и BE.



Через union


Более правильным будет использовать union, однако и он тоже будет давать неопределенное поведение на разных платформах, а так же если пытаться работать со значением, в котором еще небыло задано инициализируемое значение (union это не проверяет).



union {

float f;

uint32_t i;

} value32;



Через memcpy()


Самым правильным решением считается использование функции memcpy():


Вариант для C, без проверок:



float f=2.67;

uint32_t i;


memcpy(&i, &f, sizeof(i));



Вариант класса для Си++ с проверками:



template <class OUT, class IN>

inline OUT bit_cast(IN const& in)

{

static_assert(sizeof(OUT) == sizeof(IN), "source and dest must be same size");

static_assert(std::is_trivially_copyable<OUT>::value, "destination type must be trivially copyable.");

static_assert(std::is_trivially_copyable<IN>::value, "source type must be trivially copyable");


OUT out;

memcpy(&out, &in, sizeof(out));

return out;

}



В стиле C++20


В C++20 ввели std::bit_cast, который делает все что нужно, но при всем при этом еще и constexpr если необходимо.



float f;

int i;


i = std::bit_cast<int>(f);



Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования