printf("%f\n", 3);
来源:互联网 发布:阿里云 ads 编辑:程序博客网 时间:2024/04/30 07:41
printf("%f\n", 3);
原因在于printf,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);
printf("%f,%d\n",3,4,5);
printf("%d,%d,%d\n", (float)3.4,5);
汇编代码:
; 4 : printf("%f\n",1); 00018 6a 01 push 1 0001a 68 00 00 00 00 push OFFSET FLAT:??_C@_03FBAH@?$CFf?6?$AA@ ; `string' 0001f e8 00 00 00 00 call _printf 00024 83 c4 08 add esp, 8; 5 : printf("%f\n",1.0); 00027 68 00 00 f0 3f push 1072693248 ; 3ff00000H 0002c 6a 00 push 0 0002e 68 00 00 00 00 push OFFSET FLAT:??_C@_03FBAH@?$CFf?6?$AA@ ; `string' 00033 e8 00 00 00 00 call _printf 00038 83 c4 0c add esp, 12 ; 0000000cH
上面的是printf("%f\n",1);printf("%f\n",1.0);的反汇编代码,说明若是浮点型数,编译器会把它转化成浮点格式在入栈的,而整形是不会的转化直接压入的,而printf函数根据地2个参数%f认为前面压入的是浮点型来处理了
转自:http://www.cnblogs.com/kuangxiangjie/archive/2010/11/22/1883701.html
- printf("%f\n", 3);
- printf("%f\n", 3);
- printf("%f\n",5)
- printf("%f\n",5);/
- 为什么printf("%f\n",5)输出0.000000
- printf("%f/n",5)的问题
- 在c语言中执行这两条语句printf("%d/n", 5.01);printf("%f/n", 5);
- f(n)=f(n-1)+2*f(n-2)+3f(n-3)
- printf("%f",10/3);的结果是什么?
- 已知f[0]=f[1]=1 f[2]=0 f[n]=f[n-1]+f[n-3] 求 f[0]~f[50]的最大值
- printf(),sprintf() 与 %f
- 【转】printf("%f/n",5)的输出结果为什么是0.000000
- printf("%f",10/3); 答案是多少?----不定参数
- 论坛上看的 printf("%f",10/3);
- 关于printf("%*.*f")的问题
- f((n)=1+1/2+1/3+.....+1/n
- 编程计算斐波那契数列: F(n)= {a,n=1/b,n=2/f(n-1)+f(n-2),n>2&n为奇/ f(n-1)+f(n-2)+f(n-3),n>2&n为偶
- printf ("%*s", n, char *);
- poj 2443 Set Operation(思维&状态压缩)
- 人人网2014笔试算法题汇总
- org.hibernate.hql.ast.QuerySyntaxException:XX is not mapped
- 【C语言】11-函数的声明和定义
- 关于精益创业随想
- printf("%f\n", 3);
- QT 实现wsse username-token 实现?
- Beauty Contest(2013.09.15)(凸包)
- uva 11008 - Antimatter Ray Clearcutting(状态dp)
- CUDA的OpenCV-2.3.x/OpenCV-2.4.x编译
- 软件学院研究方向,对研究方向迷茫的同学一定要看(据说是一位北大软院前辈写的)
- Movie collection(2013.09.15)树状数组
- 初学者学Java(十五)
- JS如何获取url的参数