zoukankan      html  css  js  c++  java
  • printf("%f ", 3);输出结果为什么是0.000000(转载)

      printf不会关心你输入的参数的类型,你输入的实际是 printf("%f",3),但是这个整型3不会被隐式类型转换为浮点型,而是被直接按内存内容当作浮点型
    也就是说,内部使用等价于 int i = 3; printf("%f", *(float*)&i)
    不幸的是,整型3在内存布局上如果看成浮点数,它就是接近于0

    完整的说明一下吧。 首先 printf("%f",10/3);等价于 printf("%f",3);也就是说在这种情况下C不支持类型转换。并且"%f"处理的是double类型的浮点数也就是64位,而且默认的显示精度是小数点后6位。

    然后要考虑浮点数的表示方法,根据IEEE 754标准对64位浮点数采用的表示为:     数符(1位)| 阶码 (11位) | 尾数 (52位) 好了,可以解决问题了。你的3是6个0 + 11, 知道为什么了吧? 数太小了! 在仅仅可以显示小数点6…

    接近正确,整数3其实对应的是6个0+11+24个0+32位随机值 内存中整数3就是00000011 00000000 00000000 00000000 后面紧跟的是4字节堆栈上的当前值(可能是CS:IP) 

    这是不定参数的特点,没有类型检查,没有类型转换

    不过如果打印一个固定值都能出现随机值,只能说crt出问题了 可能的原因(首先你要看一遍11楼给的说明) 因为进入printf时, 堆栈上传进来的只有sizeof(int)个字节,而double需要的字节数比int多,因此va_arg转换时除了你传进去的4字节之外,还用了堆栈 上的相连四个字节,而这四字节内容不是你设置的,可能会随编译器、OS不同由随机产生的可能性

    记得之前看过一个介绍,printf输出时,float是当double处理的

    下面的代码似乎能验证这一点:

    //看起来不匹配,但都打印出了最后一个数字5,即float用double处理了
    printf("%f,%d ",3,4,5);
    printf("%d,%d,%d ", (float)3.4, 5);
  • 相关阅读:
    《MySQL必知必会》第六章:过滤数据
    《MySQL必知必会》第七章:数据过滤
    《MySQL必知必会》第五章:排序检索数据
    Java高级特性:clone()方法
    Java基础知识详解:abstract修饰符
    Java虚拟机:虚拟机内存区域和内存溢出异常
    Java虚拟机:源码到机器码
    Java虚拟机:本地方法栈与Native方法
    [LeetCode] 1481. Least Number of Unique Integers after K Removals
    [LeetCode] 331. Verify Preorder Serialization of a Binary Tree
  • 原文地址:https://www.cnblogs.com/xiaobiexi/p/3287519.html
Copyright © 2011-2022 走看看