• C语言位域的内存布局


     

    本文将先粗略介绍大小端,和大小端的测试方法,最后介绍位域的内存布局。

     

    1. 大小端

    大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

    小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

     

    2. 大小端测试代码

    #include <stdio.h>
    
    unsigned char find_cpu_endian(void)
    { 
        int x=1;
        unsigned char cpu_endian = 0;
    
        if(*(char*)&x==1)
            cpu_endian=1;    //小端模式 
        else
            cpu_endian=2;    //大端模式 
    
        return   cpu_endian;    
    }
    
    int main(){
    
        printf("%d 
    ", find_cpu_endian());
    
        return 0;
    }

     

    3. 探究位域的内存布局

     先科普下共用体,这个在平常编码用的也不多。

     

     上实验代码,我们通过实验代码来理解位域的内存布局。

    union{ 
        struct {
            char i:1;
            char j:2; 
            char m:3; 
        }s; 
        
        char ch; 
    }r; 
    
    int main(int argc, char argv[])
    { 
        r.s.i = 1;
        r.s.j = 2; 
        r.s.m = 3; 
        
        printf(" DEC:r.ch = %d ,  HEX:r.ch = 0x%x 
    ", r.ch, r.ch);
    
        printf("sizeof(r) = %ld 
    ", sizeof(r));
    
     return 0;
    }

    3.1在PC ubuntu 小端模式 的环境上,运行:

    root@lmw-virtual-machine:/home/lmw/桌面/C_Text# ./ab
     DEC:r.ch = 29 ,  HEX:r.ch = 0x1d 
    sizeof(r) = 1 
    root@lmw-virtual-machine:/home/lmw/桌面/C_Text# 

    根据打印的0x1d,算出二进制是 00011101 。我们画出内存布局:

    3.2在大端模式 的环境上,运行:

      不好意思,手边一块linux板子和一块单片机板子都是小端的, 没法做实验了。

    小结:

      我们常说的大小端,是以字节为最小单位进行划分的,组织各个字节在内存上的布局。
      但是经过实测发现,

           对于位域,属于一个字节内的各个域的内存布局,也会受大端、小端不同平台的影响。
      小端模式下,遵循低地址存储低bit的原则。

     

     

    .

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    Qt 无边框窗体改变大小 完美实现
    深入Windows窗体原理及控件重绘技巧
    EF里Guid类型数据的自增长、时间戳和复杂类型的用法
    Entity Framework中的Identity map和Unit of Work模式
    使用SQLite数据库和Access数据库的一些经验总结
    实现Avl平衡树
    使用Ajax
    接口和类 反射的差异性
    Guacamole 介绍
    依赖注入(DI)和Ninject
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/14060169.html
Copyright © 2020-2023  润新知