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 \n", 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 \n", r.ch, r.ch);

    printf("sizeof(r) = %ld \n", 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的原则。

 

 

.

posted @ 2020-11-30 11:04  一匹夫  阅读(500)  评论(0编辑  收藏  举报