编程题,为啥结果是0?

#include<stdio.h>intmain(){inta=1000/3;printf("%f\n",a);return0;}这个也是333,333.000000我也... #include<stdio.h>
int main()
{
int a = 1000/3;
printf("%f\n",a);

return 0;
}
这个也是333,333.000000我也能够接受,可是为啥直接弄个0.000000.

难道float与double可以玩到一块儿,int 与float差别那么大?
展开
 我来答
nulife8
2014-03-22 · TA获得超过550个赞
知道小有建树答主
回答量:295
采纳率:83%
帮助的人:137万
展开全部
先说,我是抄的答案,感谢原作者,我只按照我对C的理解,改动了与本题相关的部分,应该能明白的说明printf函数显示0的原因了,代码测试也确实如此
---------------------------------------------------------
1,之所以没输出333,这是C语言设计的原因。
2,之所以输出0,这是计算机体系结构的问题。

具体来说:

printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。而,333在内存中为00000000,00000000,00000001,01001101(这是32位)。而且333一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读64bit,也就是会读之前的很多位0,最后按照(有效数字)×(基数2)pow(指数)的方式来取数,自然结果是0

之所以Vc中不允许这种情况,而有些编译器就允许这么输出就是编译器设置的问题。按理说,这样访问内存是属于越界访问,应该禁止。不过只是读,伤害性不大而已。
追问
00000000  00000000   00000001   01001101
假设上面的数333的二进制的,共有32位,可是float也是占32位。
为什么%f会读64位,而且用printf读取的是333,输出的是默认值呢?
追答
这个通篇的重点是:“printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。”

也就是float读出来的是科学计数法:xx*2的xxx次方模式,由于333是处于后方,也就是指数位,得到的是0*2的333次方,当然输出0了
上海勤革
2024-10-18 广告
这里小编推荐一款新的IT在线编程与面试题库平台:“超级码客”,超级码客是聚焦于各级别软件开发工程师,运维,测试等技术人员,更加侧重于实战面试考题与在线测试,提供海量面试题八股理论分析,辅助机考笔试,可以说是更加适合于面试求职路上的所有IT技... 点击进入详情页
本回答由上海勤革提供
1131487
2014-03-22 · TA获得超过116个赞
知道答主
回答量:67
采纳率:0%
帮助的人:52.7万
展开全部
printf 直接将存储的变量按所给 ××格式×× 输出
而int与float型变量存储方式不同
(int)333 0x0000014d
(float)333 0x43a68000
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
山水岁月baby
2014-03-22
知道答主
回答量:20
采纳率:0%
帮助的人:6.8万
展开全部
int为整形变量,float为浮点型,两者在内存中储存结构不一样!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式