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.1fprintf
功能
转换说明符及其含义如下:
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了解有关显示更多内容的详细信息: