为什么printf中使用%f格式符输出int类型变量得不到正确浮点值?
你测试使用的代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int a=100; printf("%f",a); return 0; }
问题1:「不管传入的参数是什么类型,都应该按照格式说明符指定的类型打印」的认知是否正确?
这个认知是错误的。
C语言中printf属于可变参数函数,不会对传入的参数做自动类型适配,格式说明符必须和传入参数的实际类型严格匹配,否则会触发未定义行为,运行结果没有任何标准保障,可能输出乱码、程序崩溃,也可能出现你遇到的固定输出的情况。
问题2:为什么传入任意int值用%f打印都输出0.000000?
这个表现和你当前运行环境的函数调用约定有关,现在主流的x86-64架构下的系统V调用约定规则为:
- 整型参数会通过通用寄存器传递
- 浮点类型参数会通过XMM系列寄存器传递
%f格式说明符对应的实际参数类型是double(可变参数列表中的float类型会被自动提升为double),printf遇到%f时会直接去XMM寄存器读取对应的浮点值
你这段代码里只给printf传了int类型的变量a,这个值只会被放到通用寄存器里,printf读取的XMM寄存器没有被赋值,默认存储的就是0值,所以不管你给a修改成什么整型值,输出结果都是0.000000。
如果要实现将int值按浮点数格式打印的需求,需要手动做强制类型转换,让参数类型和格式说明符匹配:
printf("%f", (double)a);
内容的提问来源于stack exchange,提问作者varun prasad
相关产品推荐
相关产品推荐

