int a=5;
float b=5.5;
float c=5.01;
printf("%f,%d,&d",a,b,c);
先以相应的类型在内存存储,再去使用相应的格式化符进行打印,就比较容易清楚。
int类型用%f格式化
int类型32个字节,以%f格式化时,%f会默认是double类型,所以以64个字节,所以相当于一次浮点数双精度的转化。
5的二进制0000000000000000000000000000101
则以double存储就会是00000000000000000000000000000000000000000000000000000000000101
S=0(符号位1位)
E=0(11位)
M=000000000000000000000000000000000000000000000000101(52位)
公式=(-1) * S *(1.M) *2^(E-1023) 数值非常非常小,所以最终直接打印0.
float类型用%d格式化
float类型4个字节,以%f格式化时,会默认是double类型,以64字节看待
float数据可以精确表示
5.5–>101.1
以浮点数双精度转化:
1.011 * 2^2
S=0
E=2+1023
M=011
则最终的存储 0 10000000001 011+49个0
而使用%d则取低32位,所以低32位都为0,也最终打印0
float数据不能精确表示
5.01
此时在进行双精度转换时就会在尾数部分出现很多1,则最终的结果就难以预测。