Code: Alles auswählen
#include <cstdint>
#include <limits>
#include <cstring>
std::uint32_t float_as_int(float f)
{
static_assert(sizeof(float) == 4);
static_assert(std::numeric_limits<float>::is_iec559);
unsigned char b[4];
std::memcpy(&b, &f, sizeof(b));
return ((b[0] << 0U) & 0xFFU) |
((b[1] << 8U) & 0xFF00U) |
((b[2] << 16U) & 0xFF0000U) |
((b[3] << 24U) & 0xFF000000U);
}
float int_as_float(std::uint32_t i)
{
static_assert(sizeof(float) == 4);
static_assert(std::numeric_limits<float>::is_iec559);
unsigned char b[4] = {
static_cast<unsigned char>((i & 0xFFU) >> 0),
static_cast<unsigned char>((i & 0xFF00U) >> 8),
static_cast<unsigned char>((i & 0xFF0000U) >> 16),
static_cast<unsigned char>((i & 0xFF000000U) >> 24)
};
float f;
std::memcpy(&f, b, sizeof(b));
return f;
}
int main()
{
return int_as_float(float_as_int(42.0f));
}
Code: Alles auswählen
float_as_int(float):
movd eax, xmm0
ret
int_as_float(unsigned int):
movd xmm0, edi
ret
main:
mov eax, 42
ret