将十六进制值作为单精度或双精度值处理

时间:2015-01-21 12:52:56

标签: c++ floating-point

有没有办法可以用十六进制数初始化浮点型变量?我想要做的是说我有4的单精度表示,其中十六进制为0x40800000。我想做float a = 0x40800000这样的事情,在这种情况下,它将十六进制值作为整数。我该怎么做才能把它当作浮点数?

3 个答案:

答案 0 :(得分:2)

一种选择是通过type punning使用a union。这是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));

答案 1 :(得分:1)

如果引入临时整数类型变量,将其强制转换为浮点类型并取消引用它,则可以执行此操作。您必须小心所涉及类型的大小,并知道它们可能会发生变化。例如,使用我的编译器,这可以工作:

unsigned i = 0x40800000;
float a = *(float*)&i;
printf("%f\n", a);
// output 4.00000

答案 2 :(得分:1)

我不确定你是如何得到你的价值&#34; 0x40800000&#34;。

如果以int的身份进入,您可以这样做:

const auto foo = 0x40800000;
auto a = *(float*)&foo;

如果它以字符串形式出现,你可以这样做:

float a;

sscanf("0x40800000", "0x%x", &a);