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的原则。
.
/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/