c语言基础(初学) 看看这个程序,分析一下,为什么会出现这个结果,谢谢
4个回答
展开全部
又是这样的问题,再解释一次
计算机的浮点数存储依照IEEE754规范,它是这样规定的:
浮点数由两部分组成:底数部分M+指数部分E: M*2E (M和E都是2进制的
32位二进制是这样划分的:
FEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
其中F是符号位和(和整数一样)E是指数位M是有效数字位(看起来是23位,实际上是24位,并且最高位始终为1)指数部分8位,由于指数可以为负数,所以IEEE754规则规定此处的值减去127为实际指数
整数1的二进制是这样存储的
00000000 00000000 00000000 00000001
把这个数当浮点数看待,那就是:
eeeeeee e
0000000 0
MMMMMMMM MMMMMMMM MMMMMMMM
10000000 00000000 00000001
指数部分为0-127=-127,所以有效数字10000000 00000000 00000001的小数点要向左移动127位,那就是0.000000.....0001了,早超出有效位了,自然输出就是0.0000000了
就算是
printf("%f",1);
它也一样输出0.000000
要输出1.00000必须明确指定1是个float
printf("%f",1.0);这样输出就是1.00000
至于用%d格式输出b也是0的情况,就是是编译器差异了,你的编译器可能是把int 1换成float,然后把转换后的float逻辑上截断赋值给b,那就是0了,我用vs2010,%d的输出是1,所以要尽量避免使用此类代码
计算机的浮点数存储依照IEEE754规范,它是这样规定的:
浮点数由两部分组成:底数部分M+指数部分E: M*2E (M和E都是2进制的
32位二进制是这样划分的:
FEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
其中F是符号位和(和整数一样)E是指数位M是有效数字位(看起来是23位,实际上是24位,并且最高位始终为1)指数部分8位,由于指数可以为负数,所以IEEE754规则规定此处的值减去127为实际指数
整数1的二进制是这样存储的
00000000 00000000 00000000 00000001
把这个数当浮点数看待,那就是:
eeeeeee e
0000000 0
MMMMMMMM MMMMMMMM MMMMMMMM
10000000 00000000 00000001
指数部分为0-127=-127,所以有效数字10000000 00000000 00000001的小数点要向左移动127位,那就是0.000000.....0001了,早超出有效位了,自然输出就是0.0000000了
就算是
printf("%f",1);
它也一样输出0.000000
要输出1.00000必须明确指定1是个float
printf("%f",1.0);这样输出就是1.00000
至于用%d格式输出b也是0的情况,就是是编译器差异了,你的编译器可能是把int 1换成float,然后把转换后的float逻辑上截断赋值给b,那就是0了,我用vs2010,%d的输出是1,所以要尽量避免使用此类代码
展开全部
很简单,因为b是整形,一个浮点型的数字不能直接赋给整形!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你那个b= a/ 1000 ; b 是Int 所以b算出来是整形的!即b=0,所以以%d输出就是 0 以%f输出就是0.000000!
而你输出a那一行输出与数是b,所以同上!
而你输出a那一行输出与数是b,所以同上!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先你要明白/的意思 这是整除的意思 如果有int型数据 则会默认把小数点后的数四舍五入掉
至于输出的格式不一样 那是应为你的输出语句中有格式符 比如%f浮点型 %d整数型 通过这些格式符 系统会自动转换输出变量的格式 所以同一个变量输出的效果却不一样
至于输出的格式不一样 那是应为你的输出语句中有格式符 比如%f浮点型 %d整数型 通过这些格式符 系统会自动转换输出变量的格式 所以同一个变量输出的效果却不一样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询