IEEE-754 表示是否在 C 中使用?

Cor*_*n F 2 c floating-point ieee-754

我必须使用 IEEE-754对电子电荷进行编码,即 -1.602*10 -19 C。我手动完成并使用站点验证了我的结果。所以我知道我的代表是好的。我的问题是,如果我尝试构建一个以科学记数法显示我的数字的 C 程序,我会得到错误的数字。

这是我的代码:

#include <stdio.h>
int main(int argc, char const *argv[])
{
    float q = 0xa03d217b;
    printf("q = %e", q);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

$ ./test.exe
q = 2.688361e+09
Run Code Online (Sandbox Code Playgroud)

我的问题:除了 IEEE-754 之外,还有其他表示我的 CPU 可能在内部用于浮点吗?

Adr*_*ica 10

float q = 0xa03d217b;转换的整数(十六进制)字面float表示该数(或其近似值)值; 因此,分配给您qwill的值是(十进制)值2,688,360,8270xa03d217b相当于),正如您所指出的。

如果您必须float使用其内部 IEEE-754 (HEX) 表示初始化变量,那么您最好的选择是通过 a的成员使用类型双关 (在 C 中合法,但在 C++ 中合法):union

#include <stdio.h>

typedef union {
    float f;
    unsigned int h;
} hexfloat;

int main()
{
    hexfloat hf;
    hf.h = 0xa03d217b;
    float q = hf.f;
    printf("%lg\n", q);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

还有一些使用指针转换的“快速技巧”,例如:

unsigned iee = 0xa03d217b;
float q = *(float*)(&iee);
Run Code Online (Sandbox Code Playgroud)

但是,请注意,此类方法存在许多问题,例如潜在的字节顺序冲突以及您违反了严格的别名要求的事实。

  • 您可以通过使用“union”来避免别名问题,我从未见过或听说过机器对整数和浮点数使用不同的字节序,但这在技术上是可能的。更有可能的是使用非 IEEE fp 的机器,尽管现在这种情况很少见。 (3认同)