为什么我的浮点值不能正确打印?

时间:2019-08-08 19:11:03

标签: c floating-point printf

我正在尝试打印浮点值0x40a00000和0xc0200000。但是根据IEEE-754浮点转换器(https://www.h-schmidt.net/FloatConverter/IEEE754.html),我打印出的值和正确的值完全不同:

我应该根据IEEE转换器获得的值:

0x3F800000 = 5.00
0xBF000000 = -2.50

我在运行时得到的值:

float tmp1 = 0x40a00000;
float tmp2 = 0xc0200000;

printf("tmp1 = %.2f\n", tmp1);
printf("tmp2 = %.2f\n", tmp2);

tmp1 = 1084227584.00
tmp2 = 3223322624.00

由于某种原因,我的C代码没有按照IEEE标准格式化浮点值的位,而是将它们格式化为好像是带小数点的整数

4 个答案:

答案 0 :(得分:5)

这些是将十六进制数字的浮点表示形式分配给浮点数。

相反,请执行以下操作:

int i1 = 0x40a00000;
int i2 = 0xc0200000;
float tmp1, tmp2;
memcpy(&tmp1, &i1, sizeof(int));
memcpy(&tmp2, &i2, sizeof(int));

打印它们:

printf("tmp1 = %.2f\n", tmp1);
printf("tmp2 = %.2f\n", tmp2);

输出:

  

tmp1 = 5.00
  tmp2 = -2.50

完整示例:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int i1 = 0x40a00000;
    int i2 = 0xc0200000;
    float tmp1, tmp2;
    memcpy(&tmp1, &i1, sizeof(int));
    memcpy(&tmp2, &i2, sizeof(int));
    printf("tmp1 = %.2f\n", tmp1);
    printf("tmp2 = %.2f\n", tmp2);
}

答案 1 :(得分:1)

这些没有按照您认为的去做:

float tmp1 = 0x40a00000;
float tmp2 = 0xc0200000;

您只是使用要打印的十进制整数的十六进制表示形式;它们不会推入这些字节,以便可以将它们解释为浮点数。

听起来您想要做的是(以某种方式)将所需的字节获取到某个地方,获取该地址的地址,并将其强制转换为一个指向浮点数的指针,在取消引用时将其解释为浮点数。 / p>

答案 2 :(得分:0)

union
{
   int i;
   float f;
}k1,k2;

k1.i = 0x40a00000;
k2.i = 0xc0200000;

printf("f1 = %.2f\n", k1.f);
printf("f2 = %.2f\n", k2.f);

答案 3 :(得分:-1)

int i1 = 0x40a00000;
int i2 = 0xc0200000;

float f1 = *(float*)&i1;
float f2 = *(float*)&i2;

printf("f1 = %.2f\n", f1);
printf("f2 = %.2f\n", f2);