zoukankan      html  css  js  c++  java
  • 一小段测试atof的代码

    #include <stdio.h>
    //#include <stdlib.h>
    
    double a=0;
    int main(int argc, char *argv[])
    {
        a = atof(argv[1]);
        double b=a+2;
    
        printf("b = %f
    ", b);
        printf("a = %f
    ", a);
    
        return 0;
    }
    

      不管是否把注释的//放开,都能编译链接正常,把注释的//打开,atof的行为则正常,否则异常。

    也就是说atof存在两个定义,一个正确实现,一个没有实现?咨询了一个做工具链的同事,他的结论是:

    反汇编对比两个生成的代码,发现返回值的问题,正常的返回是float,异常的是返回0,也就是异常使用的是eax寄存器,而

    atof的实现,它的返回值不是在eax中的,是在xmm0中。

    其实真正的原因是:带了头文件包含stdlib.h,则会根据函数声明,生成正确的调用代码,否则就会默认地使用eax作为返回值的寄存器。

    水平有限,如果有错误,请帮忙提醒我。如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我。版权所有,需要转发请带上本文源地址,博客一直在更新,欢迎 关注 。
  • 相关阅读:
    多数据源配置
    Oracle创建JOB
    2新建Data Adapter
    注解的CRUD;重点:多对一和一对多处理
    Mybatis分页+使用注解开发!
    继续mybatis配置resultMap;讲解日志部分
    Today has a day off.
    Mybatis其他配置!
    Mybatis优化配置!
    Mybatis的CRUD
  • 原文地址:https://www.cnblogs.com/10087622blog/p/9371491.html
Copyright © 2011-2022 走看看