在c语言中执行这两条语句printf("%d/n", 5.01);printf("%f/n", 5);

在c语言中执行这两条语句 printf("%d/n", 5.01); printf("%f/n", 5);

说这两条语句最后执行结果不是输出5和5.000000 而是输出了一个和大的数(我自己执行的是1789985710)和0.000000。 是感觉非常的不可思议。。。。。。。。

其实,在我们当我们弄清楚浮点数的存储格式之后,就会明白其中的奥妙了。 在C语言标准中,浮点数是采用IEEE754标准 float类型数据存储格式如下:

最高位最低位符号S 阶码E 尾数M 最高位 31 位 ,保存符号位 S“, 0”表示正数 ,“1”表示负数 30 位~23 位 ,共 8 位 ,移码方式(指数值加上偏移量127)保存指数部分 ,称为阶码 22 位~0 位 ,共 23 位 ,保存系数部分 ,称为尾数 ,对于规范化二进制数 ,整数位的前导“1”不保存 。

隐含 直接保存小数部分 对于 double 型 ,IEEE 754 - 1985标准规定用64 位表示 ,具体如下: ·最高位63 位 ,保存 S“, 0”正数“, 1”负数; ·62 位~52 位 ,共 11 位 ,移码方式(指数值加1023)保存指数 ,称为阶码;

·51 位~0 位 ,共 52 位 ,保存系数部分 ,称为尾数 ,对于规范化二进制数 ,整数位的“1”不保存隐含) ,直接保存小数部分 将5.01压入栈,为double的数,栈8个字节。

而执行printf("%d/n", 5.01);则只需要取前四个字节就可以了。

取出来为. printf("%f/n", 5); 将5压入栈为 0000 0000 0000 0000 0000 0000 0000 0101,执行printf("%f/n", 5);需要从栈中取8个字节, 取0000 0000 0000 0000 0000 0000 0000 0101之后,还要取他之后的四个字节, 但不管如何,前四个字节为0000 0000 0000 0000 0000 0000 0000 0101的浮点数为0.000000,所以输出0.000000

注意:内存内容是没有改变的,决定内存中内容的语义是读取的格式,float和double的存储格式和int类型的格式区别非常大。(但是都是低字节放在前面,高字节放在后面)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值