编程题,为啥结果是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差别那么大? 展开
int main()
{
int a = 1000/3;
printf("%f\n",a);
return 0;
}
这个也是333,333.000000我也能够接受,可是为啥直接弄个0.000000.
难道float与double可以玩到一块儿,int 与float差别那么大? 展开
3个回答
展开全部
先说,我是抄的答案,感谢原作者,我只按照我对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中不允许这种情况,而有些编译器就允许这么输出就是编译器设置的问题。按理说,这样访问内存是属于越界访问,应该禁止。不过只是读,伤害性不大而已。
---------------------------------------------------------
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了
展开全部
printf 直接将存储的变量按所给 ××格式×× 输出
而int与float型变量存储方式不同
(int)333 0x0000014d
(float)333 0x43a68000
而int与float型变量存储方式不同
(int)333 0x0000014d
(float)333 0x43a68000
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int为整形变量,float为浮点型,两者在内存中储存结构不一样!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询