C 函数返回后浮点值更改

C 函数返回后浮点值更改,c,floating-point,C,Floating Point,我发现我的浮点值在返回后发生了变化。 我在返回前和返回后输出浮点的十六进制值。我希望十六进制输出是相同的,但它们已经改变了。你能解释一下为什么会发生这种情况,我如何防止这种情况发生 谢谢 #include <stdio.h> typedef int uint32; typedef unsigned char uint8; static const float CONST_FLOAT = 150.36e6; uint32 foo( ui

我发现我的浮点值在返回后发生了变化。 我在返回前和返回后输出浮点的十六进制值。我希望十六进制输出是相同的,但它们已经改变了。你能解释一下为什么会发生这种情况,我如何防止这种情况发生

谢谢

  #include <stdio.h>
  typedef int             uint32;
  typedef unsigned char   uint8;
  static const float CONST_FLOAT = 150.36e6;

  uint32 foo( uint8 param ) {
     return 1;
  }

  float get_float( uint8 param )
  {
       float fVal = 0.0;

       fVal = (foo( param )*1.0) / ( 60.0 * CONST_FLOAT );

       printf("fVal = 0x%X\n", fVal);
       printf("fVal = %f\n", fVal);

       return fVal;
  }

  int main(void) {
     float fTest;

     fTest = get_float(1);

     printf("fTest = 0x%X\n",fTest);
     printf("fTest = %f\n",fTest);

     return;
  }
#包括
typedef int uint32;
typedef无符号字符uint8;
静态常数浮点数常数浮点数=150.36e6;
uint32 foo(uint8参数){
返回1;
}
浮点数获取浮点数(uint8参数)
{
浮动fVal=0.0;
fVal=(foo(param)*1.0)/(60.0*常数浮点数);
printf(“fVal=0x%X\n”,fVal);
printf(“fVal=%f\n”,fVal);
返回fVal;
}
内部主(空){
浮动时间最长;
fTest=获取浮点数(1);
printf(“fTest=0x%X\n”,fTest);
printf(“fTest=%f\n”,fTest);
返回;
}
输出: fVal=0x6A96C728 fVal=0.000000

fTest=0x9AAF9000 fTest=0.000000

我希望以十六进制格式显示的fVal与十六进制格式显示的fTest相同,但结果不同,为什么


谢谢

不能使用
“%x”
说明符打印
浮点值。这是未定义的行为,您的程序显然也在相应地运行

  #include <stdio.h>
  typedef int             uint32;
  typedef unsigned char   uint8;
  static const float CONST_FLOAT = 150.36e6;

  uint32 foo( uint8 param ) {
     return 1;
  }

  float get_float( uint8 param )
  {
       float fVal = 0.0;

       fVal = (foo( param )*1.0) / ( 60.0 * CONST_FLOAT );

       printf("fVal = 0x%X\n", fVal);
       printf("fVal = %f\n", fVal);

       return fVal;
  }

  int main(void) {
     float fTest;

     fTest = get_float(1);

     printf("fTest = 0x%X\n",fTest);
     printf("fTest = %f\n",fTest);

     return;
  }
这是C11草案1570中的内容

7.21.6.1
fprintf
功能

  • 转换说明符及其含义如下:

    o,u,x,x

    unsigned int参数被转换为无符号八进制(o),无符号 dddd样式中的十进制(u)或无符号十六进制表示法(x或x);这个 字母abcdef用于x转换,字母abcdef用于x转换 转换。精度指定要显示的最小位数; 如果要转换的值可以用较少的数字表示,则会展开该值| 带前导零。默认精度为1。转换一个文件的结果 精度为零的零值不包含任何字符。 ?

  • 如果转换规范无效,则行为未定义。282)如果任何参数不是相应转换规范的正确类型,则行为未定义

  • 如何转储浮点值的十六进制表示形式?例如,它在内存中的外观。@user1144251请尝试
    printf(“fTest=%a\n”,fTest)
    以“十六进制浮点”格式打印。@chux我从未使用过
    a
    说明符,但您的说明符绝对正确,只需在草稿pdf中阅读即可。@chux有趣
    fTest
    是一个相当小的数字,
    %a
    格式显示的内容比不合格的
    %f
    格式显示的内容要多。@Weather Vane了解有关显示更多内容的详细信息: