我有一个4字节的十六进制数字,当我将其转换为浮点数时,它是-0.5(我检查了引用,这是正确的),但是printf
给出了非常错误的值:
int f=0xBF000000;
printf("%f",(float)f); // prints -1090519040.000000
我不知道这里出了什么问题!所有计算器给出的正确值都为-0.5
,但是printf
给出了以上值。
答案 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;