printf无法打印正确的浮点值

时间:2018-06-21 08:39:31

标签: c number-formatting

我有一个4字节的十六进制数字,当我将其转换为浮点数时,它是-0.5(我检查了引用,这是正确的),但是printf给出了非常错误的值:

 int f=0xBF000000;
 printf("%f",(float)f);  // prints -1090519040.000000

我不知道这里出了什么问题!所有计算器给出的正确值都为-0.5,但是printf给出了以上值。

2 个答案:

答案 0 :(得分:13)

您的int值为-1090519040。如果您打印它,则会得到以下值:

printf("%d", f); // -1090519040

如果将其强制转换为浮点型,它将使用此值并更改类型,但。因此它将得到-1090519040.0000

如果您实际上想将int解释为浮点数,则可以使用指针:

float* p = &f;
printf("%f",*p); // -0.500000

在这里,您有一个浮点指针,该指针指向整数的地址,如果您打印它,它将把这些位解释为浮点数。

Eric Postpischil的评论:

  

float *p = &f;不是重新解释文件字节的正确方法   C中的对象,因为它违反了别名规则(C 2011 [N1570] 6.5,   对象的值只能通过其有效类型访问,即   字符类型或其他某些字符)。

另一种(更好的)方法是使用内存复制并将int复制到另一个浮点数中:

int a = 0xBF000000;
float b = 0;
memcpy(&b, &a, 4);
printf("%f", b); // -0.500000

答案 1 :(得分:1)

如果您希望访问浮点值的每个字节,则可以使用联合。

typedef union
{
    struct
    {
        uint8_t Byte1;
        uint8_t Byte2;
        uint8_t Byte3;
        uint8_t Byte4;
     };
     float_t FloatValue;
} myFloatT;