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.

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>