printf 格式串和参数不匹配的后果(你想知道的C语言 1.10)
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)相关推荐
- printf \a 响铃的流程(你想知道的C语言 1.9)
Q: printf("\a")响铃的动作是在哪里执行的? A: 首先考虑是libc对转义字符'\a'做了特殊处理或者write系统调用中kernel对'\a'做了特殊处理. 这两种 ...
- C语言 printf格式化输出,参数详解
有关输出对齐 int main(int argc, char* argv[]) { char insertTime[20] = {"1234567890"}; double i ...
- printf 格式控制符的完整格式
printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少. ②-:有-表示左对齐输出,如省略表示右 ...
- *printf()格式化串安全漏洞分析(下)
*printf()格式化串安全漏洞分析(下) 测试平台:RedHat 6.1, RedHat 6.2 (Intel i386) (继续) 那么让我们来写一个简单的测试程序来看一下: <- beg ...
- C语言中printf格式详解
转自:http://blog.sina.com.cn/s/blog_60d6aadc0100undv.html printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式 ...
- c语言中printf格式大全,c语言printf()输出格式大全
1.转换说明符 %a(%A) 浮点数.十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f ...
- c语言printf格式限定符,c – 1字节有符号数的printf格式
what is the correct format for a 1 byte signed number? %hh和您选择的整数转换说明符(例如,?hhX.请参阅C11标准,§7.21.6.1p5: ...
- C语言Printf格式大全(各种%输出形式)
C语言Printf格式 C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项.各项的意义介绍如下: 1.类型类型字符用以表示输出数据的类型,其 ...
- c语言中printf的转义字符,C语言Printf格式
C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项.各项的意义介绍如下: 1.类型类型字符用以表示输出数据的类型,其格式符和意义下表所示: ...
最新文章
- Lookup Relationship与Master-Detail Relationship的关系 || formula的特性|| picklist在代码编写时的注意事项
- Python的逻辑判断和循环 || 打印九九乘法表
- 3.1 目标定位-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- Fabric学习笔记-PBFT算法
- Windows中各类画面源的截取和合成方法总结
- zookeeper 屁民
- android 编译luajit,Android 嵌入 LuaJIT 的曲折道路
- java swing panel问题_关于 Java swing Box 的使用问题
- 分布式理论和分布式一致性协议
- java io流屏幕输出_java IO流 之 输出流 OutputString()的使用
- 【sping揭秘】18、使用spring访问数据
- 控制系统设计专题(二)——自抗扰控制算法(上)
- 凸透镜成像实验软件_凸透镜成像模拟实验软件介绍
- 前端--开发“抽屉新热榜”
- Elasticsearch: collapse 去重
- 什么是BASE最终一致性
- 中国玉米面筋行业市场供需与战略研究报告
- 运筹说 第29期 | 对偶理论与灵敏度分析—影子价格
- JavaScript提取非行间样式
- BOREDHACKERBLOG: CLOUD AV
热门文章
- 怎么查询CCRC信息安全服务资质企业名单?
- 2g限制 outlook_【排障】Outlook Express 2G收件箱大小限制
- Gephi 手动安装插件
- python删掉txt第一列_python – 从文本文件中的每一行中删除第一个字符
- 学了C再看C++(1)函数
- 用汇编语言编写内存修改器
- 手机连接上OAI基站
- 一分钟生成1000份Excel随机数工作簿
- 工行python面试题目和答案_工商银行科技菁英笔试:完全平方数问题和共线点问题...
- 工业4.0物联网等将成为下一波泡沫?