• printf以%d形式输出浮点数的问题


    若运行时从键盘上输入9876543210l,则下面程序的输出结果是

    int main(){

      int a;float b,c;

     scanf("%2d%3f%4f",&a,&b,&c);

      printf(" a=%d,b=%d,c=%f ",a,b,c);

    }

    A.a=98,b=765,c=4321.000000

    B.a=98,b=0,c=0

    C.a=98,b=765.000000,c=4321.000000

    D.a=98,b=765.0,c=4321.0

    printf函数执行的时候,会先把这三个数字压入栈里,然后再执行打印。压入栈的时候按照数据本身的长度来,首先把c和b压入,并且每一个都是8个字节(printf自动转化为double)。然后再压入a是4个字节。然后再执行打印。打印的时候按照用户指定的格式来出栈。首先打印a,a打印正常。然后又打印4个字节长度的b,在栈里面由于b长度是八个字节,并且b目前是64位的表示方式,数据的后面全是0.(float 变double),电脑是小端存储方式,0存储在距离a近的地方。打印b的时候,打印的4个字节都是0.然后再打印c,c用正常的方式打印,会一下子读取8个字节,正好,读出来的八个字节前面四个字节全是0,自己可以算一下,实在太小了,因此为0. 

    栈底                                          栈顶 
    高字节 低字节 
    4321     0000      765     0000         98 

    4字节   4字节    4字节    4字节      4字节 
                 打印c                 打印b      打印a 
    附:浮点数(单精度的float和双精度的double)在内存中以二进制的科学计数法表示,表达式为N = 2^E * F;其中E为阶码(采用移位存储),F为尾数。 
    float和double都由符号位、阶码、尾数三部分组成,float存储时使用4个字节,double存储时使用8个字节。各部分占用位宽如下所示: 
                 符号位     阶码      尾数     长度 
    float              1           8         23      32 
    double          1         11        52       64 

     http://blog.csdn.net/fzp218/article/details/8971701

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    表单的编辑添加和删除 .removeClass() .append() .preAll() .attr('b') document.createElement()
    菜单与内容下拉jQuery
    s2选择框的全选和反选jQuery
    作用域
    当前触发事件的两种方式(onclick) 和 ('id') 获取
    词义分析
    Qt下载地址
    字符集(编码)转换_Qt532_QString
    字符集(编码)转换_Windows
    字符集(编码)转换_Linux
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7289885.html
Copyright © 2020-2023  润新知