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.