zoukankan      html  css  js  c++  java
  • C语言中float如何存储?

    float 内存如何存储的

    类型

    存储位数

    总位数

    偏移值
    (offset)

    数符(S)

    阶码(E)

    尾数(M)

    短实数(float)  

       1 

       8

      23

       32

    127

    长实数(double)

       1

       11

      52

       64

     1023

     

    N (10) = 123.456,

    换算成二进制表示:

    N (2) = 1111011. 01110100101111001

    = 1. 11101101110100101111001(...) * 2^6

       那么E – 127 = 6;  E = 127 + 6 = 133(10) = 10000101(2)

    M = 111 0110 1110 1001 0111 1001 (省略了最高数字位1, 23bit)

       组合起来就是:

    S          E                        M

    0        10000101      111 0110 1110 1001 0111 1001

       4bit一间隔:

    0100   0010   1111   0110   1110   1001   0111   1001

     4          2           F           6          E           9          7         9

    前两天面试某公司时,没有回答上的一个问题,总结如下,以供参考。

    问:下面这个结构类型的实例变量占用多少内存:
    struct struct1
    {
        int i;
        short j;
        char c;
    };
    我反问:是啥语言啥机器啥编译环境?
    他回答说:VC6.0下。
    我:内存对齐后占8byte。
    他又继续问:如何让它只占7byte?
    我的第一反应是使用位段,正准备回答,又感觉不对,位段不能让它不对齐啊。又想了几秒钟,还是不会,只好回他说没玩过……


    今天下午去图书馆翻了下《代码优化:有效使用内存》,发现里面提到了两种方法:
    1
    #pragma pack(push)
    #pragma pack(1)
    struct struct1
    {
        int i;
        short j;
        char c;
    };
    #pragma pack(pop)
    原来#pragma pack有几种形式,我所接触到的是#pragma pack(n),即变量以n字节对齐。

    2
    修改编译指令的参数,来禁止内存对齐:
    VC++             :/Zn1(VS2005下,右击项目-属性-配置属性-C/C++-代码生成-结构成员对齐-选“1字节(/Zn1):”(即禁止内存对齐),默认是使用默认值,即按照结构中占用空间最大的成员进行对齐。的size进行对齐。
    Borland C++ : /-a1


    2是对整个项目禁用内存对齐,而法1可以针对特定的结构禁用内存对齐,其提供了更大的灵活性.



    另外,该书中还提到:
    char不对齐;
    short沿偶地址对齐;
    int/float沿取值为4的倍数的地址对齐。
    double沿取值为8的倍数的地址对齐。


    VS2005下,默认是使用默认值,即按照结构中占用空间最大的成员进行对齐,我们可以测试下面这个结构:
    struct struct2
    {
        char i;
        short d;
        double c;
        short j;
    };

    //保持为默认值或修改编译参数/Zn?,猜下sizeof结果为多少?:)
    printf("struct2:%d ",sizeof(struct2));
    struct2 st;
    printf("%p ",&st.i);
    printf("%p ",&st.d);
    printf("%p ",&st.c);
    printf("%p ",&st.j);

     

    补充:数据的手工对齐:

    char *p;
    int temp = align_power-1;
    p=(char*)malloc(need_size + temp;
    p=(char*)malloc(((int)p+temp)&temp);//修改了p,所以释放p前记得要归位
    注:align_power是所需要的对齐幂,char*(也可以为int*)是指针类型。另外,释放p之前记得让其指向所申请的内存的首地址上。

  • 相关阅读:
    浏览器相关,回流和重绘
    Vue相关,Vuex 通俗版教程
    关于Base64
    【1801日語听解4】第7回:4月14日
    【日語听解2】第6回:4月13日
    【日語視聴説2】第6回:4月13日
    【1701日本語新聞編集】第6回:4月10日
    【1801日語写作】第6回:4月8日
    【1801日本語新聞選読】第6回:4月7日
    【1801日語听解4】第6回:4月7日
  • 原文地址:https://www.cnblogs.com/lsgsanxiao/p/5113442.html
Copyright © 2011-2022 走看看