C 返回1.0f会得到10653216

C 返回1.0f会得到10653216,c,floating-point,C,Floating Point,我有一个C函数,它返回一个类型float 当函数返回1.0f时,接收器会看到1065353216,而不是1.0 我的意思是: float Function() { return 1.0f; } float value; value = Function(); fprintf(stderr, "Printing 1.0f: %f", value); 显示: 1065353216 但不是: 1.0 仔细检查您的工作,因为您的实现是正确的 证据:您在一个源文件中定义了函数,并从另一个

我有一个C函数,它返回一个类型
float

当函数返回
1.0f
时,接收器会看到
1065353216
,而不是
1.0

我的意思是:

float Function()
{
    return 1.0f;
}

float value;
value = Function(); 
fprintf(stderr, "Printing 1.0f: %f", value);
显示:

1065353216
但不是:

1.0

仔细检查您的工作,因为您的实现是正确的


证据:

您在一个源文件中定义了函数,并从另一个源文件调用它,但没有提供签名,这使编译器认为签名是
int function()
,这会导致奇怪的结果

您应该添加签名:
float Function(),文件中的
printf

例如:

float Function();
float value;
value = Function(); 
fprintf(stderr, "Printing 1.0f: %f", value);

轮到我猜问题了:

你是:

  • 编辑源代码而不保存它
  • 编辑一个文件但编译并运行另一个文件
  • 编辑和编译一个文件但运行另一个文件
  • 做一些更复杂但相似的事情:)

您确定这是您正在编译/测试的代码吗?请提供更多上下文。有趣的是,1065353216是1.0(IEEE单精度)的整数表示。可能您的编译器或标准库有一个bug,它像%d一样解释%f?看起来像是
%d
%f
神奇地替换了,所以这里看起来没有什么问题…这有帮助吗?哇!琐碎的回答转化为评论!这是新的吗?太棒了,我不会想到这样的东西…似乎是个好的猜测:)或者你可以使用头文件。@James如果你想一想,这是同样的问题:
函数
在某个寄存器中返回它认为是
1.0f
(如果我没记错的话是AX),然后主程序认为那里有一个
int
。效果类似于使用“%d”格式字符串将
浮点
传递给
printf
时的效果。在32位x86平台上的快速测试仅在回答中描述的情况下显示问题-使用
%d
作为格式说明符打印
0
。可能如果系统是big-endian,或者
int
是64位的系统,
%d
可能实际产生所描述的输出。@Michael这是因为
float
s被提升为
double
inside
printf
和其他未声明的函数。在Op的问题中,将
float
更改为
double
也会将输出更改为零…实现!更严重的是,一些编译器/链接器/libs/任何允许使用printf/scanf(及其变体)构建的东西,禁用了FP支持(在内存有限的嵌入式h/w上有用)。我不知道如果这样一个禁用FP的构建调用具有%f浮点格式的printf会发生什么?