float的printf()为十六进制数

smi*_*997 -1 c

我很难理解为什么这个代码会导致3f000000.

float f = 5e-1;
printf("%x", *(int*)&f);
Run Code Online (Sandbox Code Playgroud)

das*_*ght 9

这是未定义的行为:标准不保证指向intfloat具有相同的对齐,因此(int*)&f强制转换无效(Q&A).

在您的情况下,演员表生成的值与下面的0.5(5e-1)的IEEE-754表示一致:

bin:    0011 1111 0000 0000 0000 0000 0000 0000
        +--- ---- -=== ==== ==== ==== ==== ====
hex:       3    f    0    0    0    0    0    0
Run Code Online (Sandbox Code Playgroud)

+符号位在哪里,-是指数位,=是尾数位.

但是,当您在其他系统上运行相同的程序时,或者即使该程序将要运行完成,也绝对无法保证相同的程序会产生相同的结果.


pmg*_*pmg 5

您可能更喜欢

void dump(const void *data, size_t len) {
    const unsigned char *x = data;
    printf("%02x", x[0]);
    for (size_t k = 1; k < len, k++) printf(" %02x", x[k]);
    puts("");
}
Run Code Online (Sandbox Code Playgroud)

然后

float f = 5e-1;
dump(&f, sizeof f);
Run Code Online (Sandbox Code Playgroud)