为何该C语言程序输出0?使用%f为何未实现int转float?
问题分析:printf用%f输出int值出现错误的原因
先看问题中的代码:
#include<stdio.h> int sum(int, int); int main() { printf("%f", sum(2, 4)); return 0; } int sum(int a, int b){ int c = a + b; return c; }
为什么输出结果是0?
- printf是可变参数函数,它不会校验传入参数和格式符的类型匹配关系,完全按照你指定的格式符去解析栈上的参数。
- 以32位系统为例,int类型的6占4字节,存储为
0x00000006;而%f会让printf读取8字节的double类型数据。当printf用浮点数格式解析这4字节的整数数据时,剩下的4字节是栈中的随机值,组合后的8字节数据对应到浮点数格式里,是一个极小的非规格化数,最终打印出来就是0.000000。
为什么%f不能自动把int转换成float?
- 可变参数的参数传递有默认提升规则:char、short会提升为int,float会提升为double,但这个提升是在参数传入printf之前完成的,不是printf根据格式符去做转换。
- 这里传入的是int类型的6,没有规则会自动将它转为float或double。printf拿到的就是int类型的参数,但
%f要求的是double类型,类型不匹配直接导致解析错误,不存在“自动转换”的环节——printf根本不知道你传入的参数类型,只会严格按格式符的要求去读数据。
内容的提问来源于stack exchange,提问作者Cryogen
相关产品推荐
相关产品推荐

