为何在C语言中用float格式打印int类型会输出0.00?
为什么用printf的%f格式打印int变量会输出0.000000?
我的代码:
int num1 =5, num2 = 5; num1--; num2--; int num3 = 7; printf("%f\n",num1); printf("%d\n",num2); printf("%f",num3);
运行后输出:
0.000000 <-WHY? 4 0.000000 <-WHY? Process returned 0 (0x0) execution time : 0.032 s Press any key to continue.
我尝试在打印时进行强制类型转换后可以正常输出:
printf("%f\n",(float)num1);
但我想知道,为什么之前无法正确打印出数字?
原因解释
核心问题是printf的格式说明符和传入参数类型不匹配,这属于C语言中的未定义行为,不过在多数常见编译器环境下会出现你看到的结果:
%f格式符要求传入浮点类型(float或double,printf会自动将float提升为double),但你传入的是int类型变量。- int和double的内存存储格式完全不同:int直接存储二进制数值,而double采用IEEE 754浮点标准,由符号位、指数位和尾数位组成。
- 当用
%f解析int值时,printf会把int的二进制数据当作double的格式来解读,这种错位解析几乎不可能得到正确的浮点数值,多数情况下就会输出0.000000。 - 而强制类型转换
(float)num1会把int的数值转换为符合IEEE 754标准的float类型,此时参数类型和%f格式符匹配,就能正确打印出对应数值。
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

