首页 > 系统相关 >(gcc常见的错误) 在windows系统环境下,使用gcc编译代码,printf 打印类似于%Lf,%Le等双精度格式化字符的值和支持c99标准环境下显示的值不同

(gcc常见的错误) 在windows系统环境下,使用gcc编译代码,printf 打印类似于%Lf,%Le等双精度格式化字符的值和支持c99标准环境下显示的值不同

时间:2022-08-30 10:24:25浏览次数:154  
标签:Lf test1 gcc Le c99 written printf aboat

在windows环境下,有时候我们使用c99标准命令进行gcc编译,但会发现,结果和我们预想的不同。这是一种语义错误。

如以下的代码:

#include <stdio.h>

int main(void)
{
   float aboat=32000.0;
   double abet=2.14e9;
   long double dip=5.32e-5;
   printf("%f can be written %e\n",aboat,aboat);
   printf("And it's %a in hexadecimal,powers of 2 notation\n",aboat);
   printf("%f can be written %e\n",abet,abet);
   printf("%Lf can be written %Le\n",dip,dip);
   return 0;
}

我们使用c99标准命令在 powershell 下进行gcc编译。 

PS D:\c\test1> gcc -std=c99 test1.c
PS D:\c\test1> .\a
32000.000000 can be written 3.200000e+004
And it's 0x1.f40000p+14 in hexadecimal,powers of 2 notation
2140000000.000000 can be written 2.140000e+009
0.000000 can be written 3.172882e-317

所得到的结果并不是以c99标准输出。解决此类问题有两种方法。

第一种方法是使用以下标准命令在gcc下重新编译c文件:

gcc -D__USE_MINGW_ANSI_STDIO test1.c

第二种方法是重新修改代码,在代码的顶端定义宏:

#define __USE_MINGW_ANSI_STDIO 1 //1表示启用
#include <stdio.h>

int main(void)
{
   float aboat=32000.0;
   double abet=2.14e9;
   long double dip=5.32e-5;
   printf("%f can be written %e\n",aboat,aboat);
   printf("And it's %a in hexadecimal,powers of 2 notation\n",aboat);
   printf("%f can be written %e\n",abet,abet);
   printf("%Lf can be written %Le\n",dip,dip);
   return 0;
}

这里需要注意的是:

#define __USE_MINGW_ANSI_STDIO 1 

这个宏定义必须放在第一行,否则用gcc编译后,结果将无法以c99标准进行printf()输出。

gcc编译。

PS D:\c\test1> gcc test1.c
PS D:\c\test1> .\a
32000.000000 can be written 3.200000e+04
And it's 0xf.ap+11 in hexadecimal,powers of 2 notation
2140000000.000000 can be written 2.140000e+09
0.000053 can be written 5.320000e-05

输出的结果就以c99标准正常输出了。

完毕!

标签:Lf,test1,gcc,Le,c99,written,printf,aboat
From: https://www.cnblogs.com/fjuyingwei/p/16638387.html

相关文章

  • 编译qt时的gcc版本问题
    编译qt5.12.12源码,用gcc4.8.5可以编译qt源代码,没有编译xcbplugin,应该也能编译成功。(顺便说一句,编译xcb插件时需要libxkbcommon,而其又依赖于libxml2等类库和meson、ninja编......
  • Oracle Recovery Tools快速解决sysaux文件不能online问题
    又一客户sysaux表空间对应的数据文件离线(file6为测试表空间数据可以不要)TueJul2611:33:412022alterdatabasedatafile2offlinedropCompleted:alter......
  • Thales: 1-vulnhub靶场
    环境信息靶机:192.168.124.150攻击机:192.168.124.129打靶过程nmap扫描端口及服务发现开放了22,8080端口访问8080是apachetomcat欢迎页面目录扫描目录扫描......
  • Mysql8.0修改lower_case_table_names参数导致重启失败
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。事件起因:在测试一个数据迁移工具时,源端orac......
  • 【MySQL】DDL因Waiting for table metadata lock卡住
    在数据库空闲时间,对表做碎片整理:altertablemy_abcengine=innodb;发现会话被阻塞,显示状态是:Waitingfortablemetadatalock 手动断开alter操作后,通过showpr......
  • MySQL无法重启报错Warning: World-writable config file ‘/etc/my.cnf’ is ignored
    MySQL无法重启报错Warning:World-writableconfigfile‘/etc/my.cnf’isignored的解决方法_Mysql_脚本之家 https://www.jb51.net/article/99027.htm问题分析在关......
  • 了解各向异性 Sobolev 空间的使用
    了解各向异性Sobolev空间的使用Photoby李酒on不飞溅在各向异性的Sobolev空间上(arXiv)作者:阮怀明,马可·斯夸西纳抽象的:我们研究了各向异性Sobol......
  • InnoDB关键特性之double write (转)
    一、脏页刷盘风险原文地址:https://www.cnblogs.com/geaozhang/p/7241744.html关于IO的最小单位:1、数据库IO的最小单位是16K(MySQL默认,oracle是8K)2、文件系统......
  • XMLHttpResquest Level2新功能
    旧版XMLHttpResquest的缺点:只支持文本数据的传输,无法用来读取和上传文件传送和接收数据时,没有进度信息,只能提示有没有完成 新版的优点:1.可以设置HTTP请求的时限2可......
  • 【C++】delete
    delete是根据指针的类型来调用析构的。当delete派生类对象填充的派生类指针,那么delete这个指针,先调用派生类析构,再调用基类析构。当多态环境下,delete指向派生类对象的基类......