为何用%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
相关产品推荐
相关产品推荐

