printf非常规的使用情况

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,则最终的结果就难以预测。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值