|
|||||||
Как получить битовое представление 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); |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|