我正在尝试打印浮点值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标准格式化浮点值的位,而是将它们格式化为好像是带小数点的整数
答案 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);