C 为什么不是';我的浮点值打印不正确吗?

C 为什么不是';我的浮点值打印不正确吗?,c,floating-point,printf,C,Floating Point,Printf,我试图打印出浮点值0x40a00000和0xc0200000。但是我打印出来的值与IEEE-754浮点转换器()的正确值完全不同: 根据IEEE转换器,我应获得的值: 0x3F800000 = 5.00 0xBF000000 = -2.50 运行时获得的值: float tmp1 = 0x40a00000; float tmp2 = 0xc0200000; printf("tmp1 = %.2f\n", tmp1); printf("tmp2 = %.2f\n", tmp2); 是 出于某

我试图打印出浮点值0x40a00000和0xc0200000。但是我打印出来的值与IEEE-754浮点转换器()的正确值完全不同:

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

0x3F800000 = 5.00
0xBF000000 = -2.50
运行时获得的值:

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

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


出于某种原因,我的C代码没有按照IEEE标准格式化浮点值的位,而是将它们格式化为一个带小数点的整数。这些并不是你想象的那样:

float tmp1 = 0x40a00000;
float tmp2 = 0xc0200000;
您只需使用正在打印的十进制整数的十六进制表示形式;它们不会将这些字节塞入,因此可以将它们解释为浮点数


听起来你想做的是(以某种方式)在某个地方获取你想要的字节,获取该字节的地址,并将其转换为指向浮点的指针,当取消引用时,浮点将被解释为浮点。

这些并不是你认为它们做的事情:

float tmp1 = 0x40a00000;
float tmp2 = 0xc0200000;
您只需使用正在打印的十进制整数的十六进制表示形式;它们不会将这些字节塞入,因此可以将它们解释为浮点数


听起来你想做的是(以某种方式)从某处获取你想要的字节,获取该字节的地址,并将其转换为指向浮点的指针,当取消引用时,浮点将被解释为浮点。

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

相反,请执行以下操作:

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);
}
#包括
#包括
内部主(空)
{
int i1=0x40a00000;
int i2=0xc0200000;
浮动tmp1、tmp2;
memcpy(&tmp1,&i1,sizeof(int));
memcpy(&tmp2,&i2,sizeof(int));
printf(“tmp1=%.2f\n”,tmp1);
printf(“tmp2=%.2f\n”,tmp2);
}

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

相反,请执行以下操作:

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);
}
#包括
#包括
内部主(空)
{
int i1=0x40a00000;
int i2=0xc0200000;
浮动tmp1、tmp2;
memcpy(&tmp1,&i1,sizeof(int));
memcpy(&tmp2,&i2,sizeof(int));
printf(“tmp1=%.2f\n”,tmp1);
printf(“tmp2=%.2f\n”,tmp2);
}

将整数赋给浮点变量时,编译器会将实际整数转换为与浮点相同的数字。So
float tmp3=0x10等于
浮点tmp3=16
用值
16.0f
初始化变量
tmp3
。要“转换”浮点数的整数位表示形式,您需要使用字节缓冲区、指针或联合。您的代码将它们设置为由这些文字表示的整数值。看起来您实际上是在尝试将内存的值设置为十六进制值。要做到这一点,您可以执行类似于
uint32\u t mval=0x40a00000;浮动tmp1=*((浮动*)(&mval))-我不熟悉C规范,这可能是ub。读得好,当您为浮点变量指定一个整数时,编译器将实际整数转换为相同的数字,但作为浮点。So
float tmp3=0x10等于
浮点tmp3=16
用值
16.0f
初始化变量
tmp3
。要“转换”浮点数的整数位表示形式,您需要使用字节缓冲区、指针或联合。您的代码将它们设置为由这些文字表示的整数值。看起来您实际上是在尝试将内存的值设置为十六进制值。要做到这一点,您可以执行类似于
uint32\u t mval=0x40a00000;浮动tmp1=*((浮动*)(&mval))-我不符合C规范,这可能是ub。读得好,这些值不是地址,这些是我想要的浮点的实际值。但我希望C能为我提供正确的格式(我没有说它们是地址。这些是浮点的实际值-0x40a00000是0x205这些值不是地址,这些是我想要的浮点的实际值。但是我希望C能为我提供正确格式的这些位。)(我没有说它们是地址。这些是您得到的浮点值-0x40a00000是。)0x205@Achal不想破坏严格的别名规则。@Achal不想破坏严格的别名规则。这是一个严格的别名冲突。将发生的情况未定义。这是一个严格的别名冲突。将发生的情况未定义。