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