Q: 如下代码的输出结果是多少?

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main(int argc, char *argv[])
{printf("%d\n", 5.0f);return 0;
}

A: %d本来对应的是整形,实际参数传入浮点数5.0f.   5.0f会强制转换成整形5吗?

对于此类问题, 最佳的分析手法是从原理和汇编出发, 不论什么格式都可以分析出.

首先, printf是如何处理格式串的, %d格式串会被printf解析出, 并从参数中取一个整数,注意,此整数是强制拿sizeof(int)字节的数据,并没有对参数做可适配转换(比如浮点数去掉小数点变成整数之类的友好转换)。

printf 格式串的处理: printf 内部原理和实现 (你想知道的C语言 1.2)

所以,其实5.0f是啥不重要,重要的是5.0f被存储的数据二进制形式是什么.

按照浮点数的IEEE754标准的转换算法,5.0f将被转换成0x40A00000. 所以,上面输出的整数应该就是1084227584.(注意此处的结论不一定是对的!)

5.0f是被转换成0x40A00000, 可以用如下代码验证:

/*Xi Chen(511272827@qq.com)cxsjabcabc
*/
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>void dump_data(void *data, int bytes)
{int i;unsigned char *p;p = (unsigned char *)data;for (i = 0; i < bytes; ++i) {printf("%x ", p[i]);}printf("\n");
}int main(int argc, char *argv[])
{float d = 5.0f;dump_data(&d, sizeof(d));return 0;
}

https://github.com/cxsjabc/basic/blob/dev/c/_topics/printf/parse_data.c

Q: 实际的运行结果看起来不是上面的数字,而且每次执行还会变动?

A: 汇编代码如下:

可以看到参数5.0f被放到了xmm寄存器中, 此为保存浮点数参数的寄存器. 但是printf内部实作会从堆栈强制找sizeof(int)字节数据,这将是不确定的信息.

在不适用xmm寄存器,而是用堆栈传递参数的编译器环境下,才会得到1084227584.

作者:     陈曦
环境:     MacOS 10.14.5Apple LLVM version 10.0.1 (clang-1001.0.46.4)Target: x86_64-apple-darwin18.6.0转载请注明出处

printf 格式串和参数不匹配的后果(你想知道的C语言 1.10)相关推荐

  1. printf \a 响铃的流程(你想知道的C语言 1.9)

    Q: printf("\a")响铃的动作是在哪里执行的? A: 首先考虑是libc对转义字符'\a'做了特殊处理或者write系统调用中kernel对'\a'做了特殊处理. 这两种 ...

  2. C语言 printf格式化输出,参数详解

    有关输出对齐 int main(int argc, char* argv[]) {  char insertTime[20] = {"1234567890"};  double i ...

  3. printf 格式控制符的完整格式

    printf的格式控制的完整格式: %  -  0  m.n  l或h  格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少. ②-:有-表示左对齐输出,如省略表示右 ...

  4. *printf()格式化串安全漏洞分析(下)

    *printf()格式化串安全漏洞分析(下) 测试平台:RedHat 6.1, RedHat 6.2 (Intel i386) (继续) 那么让我们来写一个简单的测试程序来看一下: <- beg ...

  5. C语言中printf格式详解

    转自:http://blog.sina.com.cn/s/blog_60d6aadc0100undv.html printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式 ...

  6. c语言中printf格式大全,c语言printf()输出格式大全

    1.转换说明符 %a(%A)     浮点数.十六进制数字和p-(P-)记数法(C99) %c             字符 %d             有符号十进制整数 %f           ...

  7. c语言printf格式限定符,c – 1字节有符号数的printf格式

    what is the correct format for a 1 byte signed number? %hh和您选择的整数转换说明符(例如,?hhX.请参阅C11标准,§7.21.6.1p5: ...

  8. C语言Printf格式大全(各种%输出形式)

    C语言Printf格式 C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项.各项的意义介绍如下: 1.类型类型字符用以表示输出数据的类型,其 ...

  9. c语言中printf的转义字符,C语言Printf格式

    C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项.各项的意义介绍如下: 1.类型类型字符用以表示输出数据的类型,其格式符和意义下表所示: ...

最新文章

  1. Lookup Relationship与Master-Detail Relationship的关系 || formula的特性|| picklist在代码编写时的注意事项
  2. Python的逻辑判断和循环 || 打印九九乘法表
  3. 3.1 目标定位-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. Fabric学习笔记-PBFT算法
  5. Windows中各类画面源的截取和合成方法总结
  6. zookeeper 屁民
  7. android 编译luajit,Android 嵌入 LuaJIT 的曲折道路
  8. java swing panel问题_关于 Java swing Box 的使用问题
  9. 分布式理论和分布式一致性协议
  10. java io流屏幕输出_java IO流 之 输出流 OutputString()的使用
  11. 【sping揭秘】18、使用spring访问数据
  12. 控制系统设计专题(二)——自抗扰控制算法(上)
  13. 凸透镜成像实验软件_凸透镜成像模拟实验软件介绍
  14. 前端--开发“抽屉新热榜”
  15. Elasticsearch: collapse 去重
  16. 什么是BASE最终一致性
  17. 中国玉米面筋行业市场供需与战略研究报告
  18. 运筹说 第29期 | 对偶理论与灵敏度分析—影子价格
  19. JavaScript提取非行间样式
  20. BOREDHACKERBLOG: CLOUD AV

热门文章

  1. 怎么查询CCRC信息安全服务资质企业名单?
  2. 2g限制 outlook_【排障】Outlook Express 2G收件箱大小限制
  3. Gephi 手动安装插件
  4. python删掉txt第一列_python – 从文本文件中的每一行中删除第一个字符
  5. 学了C再看C++(1)函数
  6. 用汇编语言编写内存修改器
  7. 手机连接上OAI基站
  8. 一分钟生成1000份Excel随机数工作簿
  9. 工行python面试题目和答案_工商银行科技菁英笔试:完全平方数问题和共线点问题...
  10. 工业4.0物联网等将成为下一波泡沫?