将十六进制值视为单精度或双精度值
Treating a hexadecimal value as single precision or double precision value
有什么方法可以用十六进制数初始化一个浮点型变量吗?我想做的是说我有 4
的单精度表示,即十六进制的 0x40800000
。我想做类似 float a = 0x40800000
的事情,在这种情况下,它将十六进制值作为整数。我该怎么做才能将其视为浮点数?
一种选择是使用 type punning via a union. This is defined behaviour in C since C99(以前这是实现定义的)。
union {
float f;
uint32_t u;
} un;
un.u = 0x40800000;
float a = un.f;
在标记此 C++ 时,您还可以使用 reinterpret_cast
。
uint32_t u = 0x40800000;
float a = *reinterpret_cast<float*>(&u);
在执行这些操作之前,您还应该确认它们的大小相同:
assert(sizeof(float) == sizeof(uint32_t));
如果引入一个临时整数类型变量,将其转换为浮点类型并取消引用,就可以做到这一点。您必须注意所涉及类型的大小,并且知道它们可能会发生变化。例如,对于我的编译器,这是可行的:
unsigned i = 0x40800000;
float a = *(float*)&i;
printf("%f\n", a);
// output 4.00000
我不确定你是如何获得值“0x40800000”的。
如果它以 int
的形式出现,你可以这样做:
const auto foo = 0x40800000;
auto a = *(float*)&foo;
如果这是一个字符串,你可以这样做:
float a;
sscanf("0x40800000", "0x%x", &a);
有什么方法可以用十六进制数初始化一个浮点型变量吗?我想做的是说我有 4
的单精度表示,即十六进制的 0x40800000
。我想做类似 float a = 0x40800000
的事情,在这种情况下,它将十六进制值作为整数。我该怎么做才能将其视为浮点数?
一种选择是使用 type punning via a union. This is defined behaviour in C since C99(以前这是实现定义的)。
union {
float f;
uint32_t u;
} un;
un.u = 0x40800000;
float a = un.f;
在标记此 C++ 时,您还可以使用 reinterpret_cast
。
uint32_t u = 0x40800000;
float a = *reinterpret_cast<float*>(&u);
在执行这些操作之前,您还应该确认它们的大小相同:
assert(sizeof(float) == sizeof(uint32_t));
如果引入一个临时整数类型变量,将其转换为浮点类型并取消引用,就可以做到这一点。您必须注意所涉及类型的大小,并且知道它们可能会发生变化。例如,对于我的编译器,这是可行的:
unsigned i = 0x40800000;
float a = *(float*)&i;
printf("%f\n", a);
// output 4.00000
我不确定你是如何获得值“0x40800000”的。
如果它以 int
的形式出现,你可以这样做:
const auto foo = 0x40800000;
auto a = *(float*)&foo;
如果这是一个字符串,你可以这样做:
float a;
sscanf("0x40800000", "0x%x", &a);