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

  • 相关阅读:
    关于json解析和所需jar
    Solr初步使用
    Appium-desktop使用时的一些配置
    mac电脑安装和配置tomcat步骤
    maven-reportng插件依赖添加
    maven-surefire插件配置
    mac电脑的一些操作
    元素的多种延时等待(&页面的超时处理)
    Mac系统搭建java+selenium+testng环境
    爬虫简介与request模块
  • 原文地址:https://www.cnblogs.com/roucheng/p/cprintf.html
Copyright © 2011-2022 走看看