C语言关于整数转化为浮点数

 首先看向这段代码:

#include<stdio.h>
int main()
{
    int i=3;
    float j=3.5;
    printf("%f",j*=i);  
}

输出结果为:

10.500000

再看向这段代码: 

#include<stdio.h>
int main()
{
    int i=3;
    float j=3.5;
    printf("%f",i*=j);  
}

输出结果为:

0.000000

这是为什么呢?

在第二代码中实质含义为i=i*j;正常来说输出结果应为10(浮点型转化为整型要省略小数点后面所有位数)。

但因为i为整形,却要以%f的形式输出,此时就要发生整形到浮点数的转化。

如上图表示为浮点数的存储方式,其中float类型为32位,double类型为64位。

字母的含义

            S(占一位)                    符号位(1表示负数,0表示正数)   
            E                    阶码(即表示指数位数)
            M                     尾数

如3.5在计算机的存储为

0 100000000 11000000000000000000000 

 解释:

1.因为3.5为正数,所以符号位为0;而3.5的二进制表示为11.1,写成科学计数法为

2.1.11*(2^1),所以E为1,但为了E出现负数,所以规定对与float类型中,E存储时加上127,double类型加上1023,所以E以128存储即为10000000.

3.由2.得3.5以科学计数法表示时有效位数为1.11,但因为二进制中都能表示为1.XXX*(2^X)的形式,所以一般省略1来存储,所以从左到右依次放入存储为11000000000000000000000。

综上,在看会上述代码:

已知10的二进制表示为00000000000000000000000000001010

当转化为浮点数时,默认第一位为符号位,即为0,E中存储的也全为0(对于E位全为0的数据,默认指数级为-127,且有效数字M还原时不在加上一,表示为0.XXXX来表明这个数无限接近于0),当然,对有效数字还原时这个数也无限趋于0,综上即约表示为0.XXX*(2^-127)约为0

所以最后10以%f格式输出结果为0.000000.

 

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值