我很难理解为什么这个代码会导致3f000000.
float f = 5e-1;
printf("%x", *(int*)&f);
Run Code Online (Sandbox Code Playgroud)
这是未定义的行为:标准不保证指向int和float具有相同的对齐,因此(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)
+符号位在哪里,-是指数位,=是尾数位.
但是,当您在其他系统上运行相同的程序时,或者即使该程序将要运行完成,也绝对无法保证相同的程序会产生相同的结果.
您可能更喜欢
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)