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

  • 相关阅读:
    ubuntu 1510
    创业者的困境
    创业者的窘境
    (转)Ubuntu 16.04下搭建Web服务器(MySQL+PHP+Apache)
    ESP8266的smartconfig过程(使用esptouch)
    Virtualbox下ubuntu识别USB设备
    红外人体检测
    树莓派跑讯飞语音识别(2麦阵列)
    R16平台中断
    语音识别下的智能家居
  • 原文地址:https://www.cnblogs.com/roucheng/p/cprintf.html
Copyright © 2011-2022 走看看