• 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之前记得让其指向所申请的内存的首地址上。

    来自:https://www.cnblogs.com/lsgsanxiao/p/5113442.html

     

     

  • 相关阅读:
    视觉SLAM十四讲课后习题—ch13
    视觉SLAM中涉及的各种坐标系转换总结
    《视觉SLAM十四讲》笔记(ch13)
    《视觉SLAM十四讲》笔记(ch12)
    《视觉SLAM十四讲》课后习题—ch7(更新中……)
    安装opencv_contrib(ubuntu16.0)
    《视觉SLAM十四讲》笔记(ch8)
    如何将“您没有打开此文件的权限”的文件更改为可读写的文件
    《视觉SLAM十四讲》笔记(ch7)
    ubuntu16.04下跑通LSD-SLAM的过程记录
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/10801080.html
Copyright © 2020-2023  润新知