博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
printf("%f\n", 3);输出结果为什么是0.000000(转载)
阅读量:6203 次
发布时间:2019-06-21

本文共 938 字,大约阅读时间需要 3 分钟。

  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,%d\n
"
,
3
,
4
,
5
);
printf(
"
%d,%d,%d\n
"
, (
float
)
3.4
,
5
);

转载于:https://www.cnblogs.com/xiaobiexi/p/3287519.html

你可能感兴趣的文章
python socket 多人聊天室
查看>>
nodejs中require的路径是一个文件夹时发生了什么
查看>>
P1401 城市(30分,正解网络流)
查看>>
用css实现自定义虚线边框
查看>>
C++简单版BitSet求解大量数据是否存在莫个数
查看>>
linux系统编程之进程(七):system()函数使用【转】
查看>>
(译) JSON-RPC 2.0 规范(中文版)
查看>>
linux用户修改用户shell
查看>>
Git 的 .gitignore 配置
查看>>
今天听说了一个压缩解压整型的方式-group-varint
查看>>
【站点部署】解析二级域名并部署站点
查看>>
iOS常用第三方库大全,史上最全第三方库收集
查看>>
iis下php 500错误
查看>>
蛋清打发奶油状
查看>>
二叉树的基本操作及应用(三)
查看>>
repcached配置与简单測试
查看>>
第五章 MVC之Bundle详解
查看>>
Suricata的初始化脚本
查看>>
Makefile中怎么使用Shell if判断
查看>>
Android RecyclerView 二级列表实现
查看>>