printf不会关心你输入的参数的类型,你输入的实际是 printf("%f",3),但是这个整型3不会被隐式类型转换为浮点型,而是被直接按内存内容当作浮点型
也就是说,内部使用等价于 int i = 3; printf("%f", *(float*)&i)
不幸的是,整型3在内存布局上如果看成浮点数,它就是接近于0

完整的说明一下吧。 首先 printf("%f",10/3);等价于 printf("%f",3);也就是说在这种情况下C不支持类型转换。并且"%f"处理的是double类型的浮点数也就是64位,而且默认的显示精度是小数点后6位。

然后要考虑浮点数的表示方法,根据IEEE 754标准对64位浮点数采用的表示为:     数符(1位)| 阶码 (11位) | 尾数 (52位) 好了,可以解决问题了。你的3是6个0 + 11, 知道为什么了吧? 数太小了! 在仅仅可以显示小数点6…

接近正确,整数3其实对应的是6个0+11+24个0+32位随机值 内存中整数3就是00000011 00000000 00000000 00000000 后面紧跟的是4字节堆栈上的当前值(可能是CS:IP)

这是不定参数的特点,没有类型检查,没有类型转换

不过如果打印一个固定值都能出现随机值,只能说crt出问题了 可能的原因(首先你要看一遍11楼给的说明) 因为进入printf时, 堆栈上传进来的只有sizeof(int)个字节,而double需要的字节数比int多,因此va_arg转换时除了你传进去的4字节之外,还用了堆栈 上的相连四个字节,而这四字节内容不是你设置的,可能会随编译器、OS不同由随机产生的可能性

记得之前看过一个介绍,printf输出时,float是当double处理的

下面的代码似乎能验证这一点:

//看起来不匹配,但都打印出了最后一个数字5,即float用double处理了
);
);

printf("%f\n", 3);输出结果为什么是0.000000(转载)的更多相关文章

  1. printf("%d",5.01)和printf("%f",5)的输出结果

    printf(); printf("%d\n",5.01); printf(); printf(.f); 输出结果: 看到结果,会感觉非常奇怪.1处怎么会输出0呢?2又为何会显示这 ...

  2. printf("%f\n",5);

    http://zhidao.baidu.com/link?url=87OGcxtDa6fQoeKmk1KylLu4eIBLJSh7CA3n5NWY-Ipm9TxZViFnIui307duCXWhaM0 ...

  3. 【Shell脚本学习15】shell printf命令:格式化输出语句

    printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同. 注意:printf 由 POSIX 标准所定义,移植性要比 ech ...

  4. shell printf命令:格式化输出语句

    printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同. 注意:printf 由 POSIX 标准所定义,移植性要比 ech ...

  5. Java数字格式化输出时前面补0

    Java数字格式化输出时前面补0 星期日 2014年11月30日|  分类: Java     /** * 里数字转字符串前面自动补0的实现. * */ public class TestString ...

  6. printf以%d形式输出浮点数的问题

    若运行时从键盘上输入9876543210l,则下面程序的输出结果是 int main(){ int a;float b,c; scanf("%2d%3f%4f",&a,&a ...

  7. PHP提升echo, printf, print, file_put_contents等输出方法的效率

    让ECHO变快, 让PHP的请求处理过程, 尽快结束, 之所以ECHO慢, 是在等待”写数据”成功返回, 那么一个比较简单的办法, 就是打开输出缓存, 编辑php.ini output_bufferi ...

  8. 通过printf设置Linux终端输出的颜色和显示方式

    转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出 ...

  9. C语言实现printf的基本格式输出%d,%c,%p,%s

    关于printf的实现,想必看过我之前发表的文章的伙伴们已经了解了不少基本的知识.好了,接下来不多说了,直接上源码,看看一种简单的实现方式: #include <stdio.h> #def ...

随机推荐

  1. react 项目及视频

    项目     视频

  2. 目标跟踪之ECO:Efficient Convolution Operators for Tracking

    一. 相关滤波算法总结 作者首先分析了 影响相关滤波算法效率 和 导致过拟合 的几个原因: 1)Model Size (模型大小) 包括两个方面: - 模型层数,对应多分辨率 Sample,比如多层 ...

  3. canvas 创建渐变图形

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. 2017年--10年java大神告诉你开发最常用的百分之二十的技术有哪些?

    首先题主说的20%我不知道从哪方面去理解.接下来我会将自己多年来工作中会经常使用到的技术列出来. 1.html.css 2.java工作原理(jvm) 3.java语法.数据结构和算法 4.java语 ...

  5. Markdown list状态下插入代码

    /***************************************************************************** * Markdown list状态下插入代 ...

  6. PHPExcel导出导入

    便于记忆 这里写一个PHPexcel导出的demo 我们构造一个数据   $letter = array('A','B','D','E'); //sheet索引   $date = array( ar ...

  7. [QT][问题记录]发布软件时遇到的问题

    2017-3-9 11:22:13 无法定位程序输入点 _ZdaPvj 于动态链接库 libstdc++-6.dll 上. 这是在自己机器上出现的问题. 使用cmd 进行命令 windeployqt  ...

  8. HihoCoder1622 : 有趣的子区间(预处理+组合数)

    有趣的子区间 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个区间[a, b]内恰好包含偶数个回文整数,我们就称[a, b]是有趣的区间. 例如[9, 12]包含 ...

  9. java如何获取当前时间,精确到毫秒

    import java.text.SimpleDateFormat; import java.util.Date; import java.util.Calendar; //func1 Calenda ...

  10. DbEntry 访问Access2010数据库

    在用DbEntry访问Access2010的时候报错如下: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序 解决方案: 安装AccessDatabaseEngine组 ...