• double x = 12.5; printf("%d\n",x);



    #include <stdio.h>
    int main()
    {
    	double x = 12.5;
    	printf("%d\n",x);
    	int y = 10;
    	printf("%lf\n",y);
    }

    输出:

    0
    0.000000


    float x = 12.5;

    printf("%d\n", x);float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)
    double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)
    然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的float和double的内存二进制完全不一样。别忘了在x86芯片下使用是的反字节序,高位字节和低位字位要反过来。所以:
    float版:0x41480000 (在内存中是:00 00 48 41)
    double版:0x4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)

    而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。 这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。


    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int main()
    {
    	int x = 1;
    	printf("%d\n", x);
    	return 0;
    }
      符号位 指数位 小数部分 指数偏移量
    单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
    双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023

    int i=2;

    4个字节就是 00000000 00000000 00000000 00000010
    然后根据你的printf 格式,
    float 解析:
    高位0表示正数,
    指数8位都是0, 那么就是 -127 次方, 然后...尾数已经不用考虑了 ~

    -127 次方,
    得到的结果基本是 0,
    以float 6-7 位的精度,
    显然得到的结果是 0 ...
    (2 的-127 次方, 估计得接近40位小数才有非0值出现)


  • 相关阅读:
    ASP.NET连接数据库配置文件
    ASP.NET应用程序的文件类型及文件夹列表
    c#配置文件的简单操作
    js加载XML文件
    c#生成动态库并加载
    class和id的区别
    Div和Span的区别
    C#类和对象
    C#表达式和语句
    函数声明提升和变量提升
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835332.html
Copyright © 2020-2023  润新知