zoukankan      html  css  js  c++  java
  • printf面试经典一例张子芳

    在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

  • 相关阅读:
    斑马打印交叉线制作方法
    c# 导出2007格式的Excel的连接字符串
    MySql数据库 timeout超时报警的解决方法
    c# 根据域名的到对应的IP
    c# 开发+MySql数据库
    c# datagridview导出Excel文件 问题
    ae GP制作缓冲区分析
    ae 地理坐标与投影坐标转换 [转]
    Dev Winform 简洁界面模板制作
    Dev TreeList 总结
  • 原文地址:https://www.cnblogs.com/zifang888/p/3026781.html
Copyright © 2011-2022 走看看