c printf 函数的一些误区 以及 int, float 在内存中的存储方式

最近一个朋友在技术群里问了一个问题。 大意 就是 100 × 0.01 打印 出来 竟然是0。 下面是他的代码

int _tmain(int argc, _TCHAR* argv[])
{
	int i = 100;
	float f = 100 * 0.01;
	printf("%d",f);
	return 0;
}

聪明的同学可能发现了其中的端倪,错误发生在 
printf("%d",f);
错误的将 float 用 整形的 方式 打印出来。


可是 为什么 1.0  用 %d 的方式 打印出来 是 0 ,为什么不是 1,这就要从 int 和 float 的 内存 存储方式 说起。

int 在内存中是 用 补码的方式 存储的 ,即  符号位 + 值 , 符号位 为0,表示整数,符号位为1,表示负数。

float 在内存中的 存储方式是 用 指数的 形式 存放的。  即 符号位+ 指数位 + 小数位

打印1.0 的指数行书:

printf("%e",1.0);

1.0 的符号位 为 0 ,指数为 0, 小数位 为 1.000 ,真正存储的时候 是 不存储 1 的。 只存储 小数点 后面的 数。

所以 1.0 在 内存的 存储 就是  32个0 , 按整形方式 打印出 0 ,就 一点 都 不足为奇了。




浮点数存储详解网址:http://shatler.iteye.com/blog/649896






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值