执行int a=016;printf int64("%0",a);,输出的结果是?

1,之所以没输出5,这是C语言设计的原因。
2,之所以输出0,这是计算机体系结构的问题。
具体来说:
printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。
C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。这点就和huhugo88所
说一样,5在内存中为00101。而且5一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读
64bit,也就是会读之前的很多位0,最后按照(有效数字)×(基数2)pow(指数)的方式来取数,自然结果是0
之所以Vc中不允许这种情况,而有些编译器就允许这么输出就是编译器设置的问题。按理说,这样访问内存是属于越界访问,
应该禁止。不过只是读,伤害性不大而已。
对于单精度浮点数(32bit),不少c语言编译系统以24位表示小数部分(包括1bit符号位),以8位表示指数部分。
==========================
printf(&%d/n&,5.01);  为什么输出一个大数?
在讲这个题目之前,预备知识,讲一下,printf函数,输入参数是读入缓冲区保存,再按照%?的格式从缓冲区中读出数据,并据此格式解释数据。
有了这个知识之后,在讲程序员面试宝典上看到一个题:
#include &stdio.h&
int main(int argc, char* argv[])  
{  
    printf(&%d/n&,5.01);  
return 0;  
}  
输出结果为: 
然后开始研究为什么会是这个数?
5.01是double类型,内存中占8个字节,保存在缓冲区。而%d为整型,占4个字节,printf从缓冲区中读入4字节,先读到低32位的数据。也就是说printf输出的应该是5.01以double类型保存数剧的低32位。为了检验此结果是否正确,对比5.01在内存中的表示与输出。
#include &stdio.h&
int main(int argc, char* argv[])  
{  
double d = 5.01;  
int *p = (int *)(&d);  
int rst = ;  
    printf(&1).%x/n&,*p);  
    printf(&2).%x/n&,*(p+1));  
    printf(&3).%x/n&,rst);  
return 0;  
}  
输出为:  
1).0x70a3d70a  
2).0x40140a3d  
3).0x70a3d70a 
这也就证明了%d输出了5.01的低32低。5.01的double类型,在内存的的表示为0xa3d70a。
事情看似也就完成了。
我又想,如果输入是浮点类型的5.01f,又会发生什么呢?
#include &stdio.h&
int main(int argc, char* argv[])  
{  
float f = 5.01f;    
int *p = (int *)(&f);       
    printf(&1).0x%x/n&,*p);    
    printf(&2).0x%x/n&,5.01f);    
return 0;    
}  
输出:  
1).0x40a051ec  
我们发现,此时输出的并不是浮点类型5.01f的内存的表示,这是为什么呢?
然后看到一个说法,是printf会把%f按double类型输出,也就是说会把参数float型的转成double型在输出。
但现在并不是%f,当然用%f显示的是正确的结果。于是我猜测,printf是将所在float型读入的数据都自动的转化为double型了,然后%f就按double处理,而我们这是%d,所以显示的为float转化为double型后的低4字节。
验证此想法:
#include &stdio.h&
int main(int argc, char* argv[])  
{  
double f = 5.01;    
int *p = (int *)(&f);  
    printf(&1).0x%x/n&,*p);  
    printf(&2).0x%x/n&,*(p+1));    
    printf(&3).0x%x/n&,5.01f);    
return 0;    
}  
输出:  
1).0x70a3d70a  
2).0x40140a3d  
但是我们发现结果并不一样,于是我又猜想,也是许printf将float转化为double的方式与默认的方式不一样
5.01d的默认的表示为:0xa3d70a,在上面已经说明了
#include &stdio.h&
int main(int argc, char* argv[])  
{  
    printf(&0x%8x/n0x%8x/n&,5.01f);  
return 0;  
}  
输出为:  
0x0; 
0x40140a3d 
与是发现printf将5.01f-&5.01d的表示是:0x00000
接着就是看这两个值是否都是为5.01了:
#include &stdio.h&
int main(int argc, char* argv[])  
{  
int d1[2], d2[2];  
    d1[0]=0x;  
    d1[1]=0x40140a3d;  
    d2[0]=0x70a3d70a;  
    d2[1]=0x40140a3d;  
double *p1 = (double *)d1;  
double *p2 = (double *)d2;  
    printf(&1).%f/n&,*p1);  
    printf(&2).%f/n&,*p2);  
return 0;    
}  
输出为:  
1).5.0; 
也就证明了0x00000,与0xa3d70a都是5.01d在机器中的表示。前者为5.01f(0x40a051ec)由printf转化为double后的表示,后者为5.01d的默认的表示。
总结:printf将输的浮点型参数全都自动转化为双精度型,且与默认的双精度的表示方法是不同的。最重要一点,printf不安全,类型不安全,要是类型不对了,也许我们就挂了^_^
本文已收录于以下专栏:
相关文章推荐
原文地址:C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0
COPY FROM:http://blog.csdn.net/yahohi/article/details/7701434
[cpp] view
plaincopyprint?
...
view plaincopyprint?
printf(&%f\n&,5);  printf(&%d\n&,5.01);   printf(&%f\n&,&#160...
C语言中printf用%d输出float类型数据,或以%f输出int型数据的结果
IEEE754标准 单精度(32位)/双精度(64位)浮点数解码
float double 有效位数
int main(void)
scanf(&%d&,&n);
printf(&%d\v&,n);
原文地址:http://blog.csdn.net/wusuopubupt/article/details/8817826
wusuopubupt
提示:请直接按CTRL+F搜索您要查找...
请直接按CTRL+F搜索您要查找的转义字符。
The C Family of Languages: Interview with Dennis Ritchie, Bjarne Stroustrup, and James Gosling
转自:http://blog.csdn.net/wusuopubupt/article/details/8817826
本文地址:http://blog.csdn.net/wusuopubupt/a...
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)> 问题详情
下列程序执行后的输出结果是void func(int *a,int b[]){b[0]=*a+6;} main(){int a,b[5]; a=0;b[0
悬赏:0&答案豆
提问人:匿名网友
发布时间:
下列程序执行后的输出结果是 void func(int *a,int b[]) { b[0]= *a+6; } main() { int a,b[5]; a=0; b[0] =3; func(&a,b);printf("%d\n",b[0]);}A.6B.7C.8D.9
为您推荐的考试题库
您可能感兴趣的试题
1软件是指A.程序B.程序和文档C.算法加数据结构D.程序、数据与相关文档的完整集合2为了提高测试的效率,应该A.随机选取测试数据B.取一切可能的输入数据作为测试数据C.在完成编码以后制定软件的测试计划D.集中对付那些错误群集的程序3以下不属于对象的基本特点的是A.分类性B.多态性C.继承性D.封装性4下列叙述中,不符合良好程序设计风格要求的是A.程序的效率第一,清晰第二B.程序的可读性好C.程序中要有必要的注释D.输入数据前要有提示信息
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
找答案会员
享三项特权
找答案会员
享三项特权
找答案会员
享三项特权
选择支付方式:
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
常用邮箱:
用于找回密码
确认密码:C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0
*******************************float类型%d输出**************************************
& & & float
如果用printf("%d",a);输出的是0。&
但float型用%d输出是否一定是0呢,答案肯定不都是0;
& & & 为什么 7.5
用%d输出的是0?分析如下:
首先来了解下printf的输出格式,int 和 long int 都是32位的,用%d输出;float 、double都是%f输出,但
float 是32位的,double 是64位的,所以在参数传递的时候C语言统一将 float 类型数值传换为 double
类型再传入 printf 函数。如果是32位整型则输出格式为%lld。
& & & 下面来讲一下
&float a=7.5
printf("%d",a)输出为0的情况:
%d只输出低32位的数据,并将这些32位二进制以十进制数输出,编译器首先将
7.5从float类型转换为double类型,7.5在内存中的存放方式是0x40f00000,转换成double类型在内存中的数据就是这个0x401e,这个内存数据可以很明显看出低32位全是0,而%d则只能截取到低32位,所以这个以%d输出7.5的数值当然是
0了。如大家不相信可以用%lld
输出看看,这个%lld就很读到低64位数据,读出的结果就是0x401e,在屏幕上看到一个很大的十进制数。
如果我一定要输出7.5在内存中的存放方法怎么办呢?
可以用printf("%d",*(int
*)&a);这里做了一下处理,不是直接把a传进来,把a所在地址里的内容处理了一下,不管a是什么类型,只对地址进行操作,利用(int
*)&a,将a所在地址中的内容0x40f00000直接当成 int 类型传给printf,int
的类型数据不会再转成double类型了,所以输出正常,这个只是针对浮点型数据只占低32位,如果输出64位还得用%lld格式控制输出。
如果用printf("%d",(int)a),输出行不行,这个强制类型转换只针对a的数据类型进行转换,7.5转换 int
类型是7,而上面的*(int
*)&a,是对内存中的实际存储数据进行操作,蔽开数据类型这一层面,只将这个数据0x40f00000直接转成int类型输出。而(int)a,要先看a的类型,C语言会根据所要数据类型,对内存存储的数据进行改变,以便可以用int类型正确解析内存数据。
如果用printf("%d",(float)a),输出什么,输出的是0,这个只是将a的float类型还转成float类型,还是自动转成doube类型,传给printf函数。
为什么float非要转成double类型呢,因为printf格式控制浮点型输出只有%f,所以统一按doube类型输出,不像整型有32位的%d或%ld,64位的有%lld,这就将32位整型和64位整型用不同的格式控制分开了,而%f则没有,所以printf输出的浮点数其实是统一遍历了64位内存,如果float传入printf没有进行转换,那么printf输出高32位数据将不可预知,printf输出结果也就不正确了,因此传入printf的浮点数都会被编译器隐含转成double类型。
***********************int类型%f格式输出************************************
& & & 如果定义了int
a=0x40f00000;用printf("%f",a)输出的结果是多少呢?
答案是0,至少我们看的屏幕上显示的是0.000000,实际值可不是0啊,只是我们显示的精度只能有15位小数,而实际的数据可能很小很小,0.0000....000几百个0后会有几个有效数据,我们分析一下。
首先C语言把a传进printf,因为a是整型,所以不会自动转成double型数据,直接将0x40f00000传进printf,而%f寻的是64位内存,也就是把0xf00000这个内存中的数据当成浮点型输出来,那浮点型的数据是多少呢,又是怎么存储的呢?
64位浮点数的存放方式:
& & & 63位
& & 62~52位 &
& & & 1个符号位
&11个阶数 & &
从0xf00000来看
1)符号位是0,表示正
& & 2)阶数是0,表示-1023 + 1023 =
0,用指数表示:1.#*2^-1023,‘#’是代表尾数。
3)尾数就是,0x00
4)浮点二进制表示
&2#1.0000*2^(-1023),-1023次方可想而知有多小。
这就是为什么我们的int型数据用%f输出是0.000000的原因。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前位置: >
以下程序执行的输出结果是( & )。
& & int a=0,b=0,c=0,d=0;
& & if(a=1)
& & & & b=1;
& & & & c=2;
& & & & d=3;
& & printf(&%d,%d,%d,%d\n&,a,b,c,d)
A.0,1,2,0
B.0,0,0,3
C.1,1,2,0
D.编译有错
所属学科:
试题类型:客观题
所属知识点:
试题分数:2.0 分
暂未组卷。
暂无学习笔记。
&&&&&&&&&&&&&&&希赛网 版权所有 & &&

我要回帖

更多关于 printf short int 的文章

 

随机推荐