C语言GCC编译环境下打印double long变量输出错误如何解决
问题成因
你遇到的输出异常是Windows平台MinGW系列GCC工具链的典型兼容性问题,核心原因如下:
- 你本地使用的Windows版GCC(MinGW/MinGW-w64)默认将
long double(你代码里写的double long是合法等价写法)实现为80位扩展精度浮点类型,但MinGW默认链接的微软C运行时库(MSVCRT)的printf系列函数不支持80位long double的解析,%Lf格式化符在MSVCRT中仅能匹配64位double类型。80位浮点数据被当作64位解析时发生字节错位,就会出现输出-0之类的异常结果,这个问题和你修改格式化符的小数位参数没有关系。 - 在线Rextester平台的GCC运行在Linux环境下,配套的glibc标准库原生支持80位
long double与%Lf的匹配逻辑,因此输出正常。
解决方法
可任选以下一种方案修复:
- 编译时添加宏定义参数,强制使用MinGW自带的ANSI标准I/O实现,编译指令改为
gcc 你的源文件名.c -o 输出程序名.exe -D__USE_MINGW_ANSI_STDIO=1,即可让%Lf正常识别80位long double类型。 - 无需修改编译参数,输出时将
long double强制转换为double类型即可,把printf语句修改为printf("%.f", (double)x);。 - 若对浮点精度没有极高要求,直接将变量类型从
long double改为double,格式化符对应改为%f即可。
内容的提问来源于stack exchange,提问作者XArchenon
相关产品推荐
相关产品推荐

