You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用%f输出EOF得到0.000000而非预期的-1.0?

为什么用%f输出EOF会得到0.000000?

EOF在C标准里是个int类型的宏,通常值为-1。当你用printf("%d", EOF)时,%d是对应int类型的格式符,参数类型匹配,所以能正确输出-1。

但换成%f就出问题了:

  • %f要求对应的参数是double类型(哪怕传float也会被隐式转成double)。
  • 你传的却是int类型的EOF,这属于格式符与参数类型不匹配,是C标准定义的未定义行为——结果没有统一标准,不同编译器、平台可能输出不同值。

从底层内存解析的角度看,多数系统中int占4字节,double占8字节:
int类型的-1在内存里是4个全1的字节(比如0xFFFFFFFF),传给printf时栈上只压入这4字节数据。而%f会尝试读取8字节数据来解析成double,剩下的4字节是栈里的随机垃圾值。这8字节组合成的二进制数据,解析成double后是一个极其接近0的极小值,printf默认只显示小数点后6位,所以就被四舍五入成了0.000000。

说白了就是:你让printf用解析浮点数的规则去读一个整数的内存,结果自然不是你预期的-1.0。

内容的提问来源于stack exchange,提问作者Lourdh Irudhaya Selvam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:15:01