C 返回1.0f会得到10653216
我有一个C函数,它返回一个类型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 仔细检查您的工作,因为您的实现是正确的 证据:您在一个源文件中定义了函数,并从另一个
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()文件中的code>,文件中的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
insideprintf
和其他未声明的函数。在Op的问题中,将float
更改为double
也会将输出更改为零…实现!更严重的是,一些编译器/链接器/libs/任何允许使用printf/scanf(及其变体)构建的东西,禁用了FP支持(在内存有限的嵌入式h/w上有用)。我不知道如果这样一个禁用FP的构建调用具有%f浮点格式的printf会发生什么?