• printf的题目


    以前学习于渊老师的《自己动手写操作系统》一书的时候,也自己实现过printf,不过那是比较简单的版本。最近看《程序员面试宝典》,做到这么一道题目:
    #include <stdio.h>
    int main{
        printf("%f",5);
        printf("%d",5.01);
    }

    问题是输出什么?
    题目不难但很细节:第一个输出0.000000,因为printf函数遇到%f,认为参数是个double类型(printf函数中float自动转为double),而5是个int型,只有四位,那么输出取8位发生越界,输出0.000000,第二个输出是只取四位,输出一个较大的数。

    于是我想:printf("%f %d",5,5.01);会是什么呢

    事实上输出两个都是大数,只不过第一个输出浮点数后面有很多0,第二个输出则和前面的第二个输出一样

    个人观点分析其原因:

    首先栈是向下生长的,而printf函数(其实是所有函数)参数入栈都是从右往左的,那么5.01先入栈,5再入,也就是5.01在高地址,5在低地址,输出%f的时候,取5所占的全部位和5.01的低四字节,输出一个大数,输出%d取高字节,也输出一个大数。http://hovertree.com/menu/c/
    为了直观地看出这种分析:
    我们用下面语句做测试:

    printf("%f  %d",5,120.5);

    其中:120.5的存储格式如下:

    0 100 0000 0101 1110 0010 0000 0000  0000     0000 0000 0000 0000 0000 0000 0000 0000
    低4字节全是0,高4字节是个大数,
    所以输出应该是0.000000和一个大数
    实际输出如下:

    推荐:http://www.cnblogs.com/roucheng/p/cfenge.html

  • 相关阅读:
    关于v$librarycache的几个字段含义
    nmon监控
    ORA-01841: (full) year must be between -4713 and +9999,
    MySql 5.7 新特性概览
    权限传递
    ORA-03135 防火墙超时设置断开db link 连接
    Oracle Profile使用详解(转)
    查看Oracle数据库SQL执行历史
    ALTER SEQUENCE 导致 REPLICAT 延时
    trace/trace2命令
  • 原文地址:https://www.cnblogs.com/roucheng/p/cprintf.html
Copyright © 2020-2023  润新知