C提供带二进制位的浮点数会产生错误的数字

时间:2018-04-18 23:10:52

标签: c floating-point binary hex

所以,在CI我试图给一个浮点变量一个二进制位(或十六进制数字)的数字,然后打印出来,但它不想打印我手工计算或在线计算的数字转换器。

float x = (float) 0b01000001110010000000000000000000;

float x = (float) 0x41C80000;

使用

打印时
printf("%f", x);

产生如下结果:

  

1103626240.000000

而不是预期的25,由于符号位为0,指数位为131,并且分数为1.5625。

为什么会这样,我怎样才能得到我想要的结果?

1 个答案:

答案 0 :(得分:3)

十六进制中的值0x41C80000是一个十进制值1103626240的整数。在您的代码中,您将此值转换为float,从而为您提供此结果:

x = 1103626240.000000

可以使用union

来解决此问题
union uint_to_float {
    unsigned int u;
    float f;
};

union uint_to_float u2f;
u2f.u = 0x41C80000;
printf("x = %f\n", u2f.f);

修改 正如@chux所提到的,使用uint32_t中的stdint.h代替unsigned int是更好的解决方案。