zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    最短路径BellmanFord , Dijsktra
    minhash
    eclipse 中使用tomcat
    http 服务
    MongoDB小记
    java post 请求
    hadoop拾遗(五)---- mapreduce 输出到多个文件 / 文件夹
    weka数据挖掘拾遗(二)---- 特征选择(IG、chi-square)
    weka数据挖掘拾遗(一)---- 生成Arff格式文件
    基于SimHash的微博去重
  • 原文地址:https://www.cnblogs.com/roucheng/p/cprintf.html
Copyright © 2011-2022 走看看