获取十六进制格式的浮点数

Get float in HEX format

我有字符串 char str [8]。它显示一个十六进制格式的数字。它是浮动的并带有一个标志。如何将其写入 float 类型的变量?

例如:

char str[9] = "41700000[=10=]";

我需要从中获取 val:15.0

这是一种将 15 从十六进制 4 字节表示形式还原的快速而肮脏的方法。但是,它有太多的错误,甚至无法开始谈论它,正确的做法是问问自己 "why do i need this to begin from, and how can i do something better instead".

float hexStrToFloat(const char* str)
{
    union { unsigned int i; float f; } tmp;
    sscanf_s(str, "%x", &tmp.i);
    return(tmp.f);
}

脚注:假定机器为 32 位或更高版本的小端字节序。

你可以双关数据:

  1. 使用 memcpy
unsigned int u = 0x41700000;
float f;

memcpy(&f, &u, sizeof(f));
printf("%f\n", f);
  1. 使用union(IMO合法,很多人持相反意见)
union un
{
    float f;
    unsigned u;
};

void foo(unsigned x)
{
    union un a = {.u = x};
    printf("%f\n", a.f);
}

我假设浮点数 && 整数具有相同的大小。

当然,您必须将问题中的字符串转换为无符号值 - 但它相对容易(scanf、atoi ....)

PS 顺便说一句,许多编译器会为两者生成完全相同的代码(没有 memcpy 调用)https://godbolt.org/z/VaCcxS