linux结构体大小端,位结构体+大小端模式
发布日期:2021-06-24 12:04:18 浏览次数:2 分类:技术文章

本文共 1562 字,大约阅读时间需要 5 分钟。

位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便

位结构定义的一般形式为:

struct  位结构名{

数据类型 [变量名]: 整型常数;

数据类型 [变量名]: 整型常数;

}位结构变量;

数据类型必须是整型(int char short)

例如:定义一个位结构

struct test{

char a: 8;

char b: 4;

char c: 3;

char d: 1;

}ch;

printf("%d\n",sizeof(struct test));

a:占用低字节的0~7共8位

b:占用高字节的0~3位

c:占用高字节的4~6位

d:占用高字节的第7位

输出多少?

(8+4+3+1)/8=2

struct info{

char name[8];

int age;

float pay;

unsigned char state: 1;

unsigned char pay: 1;

}workers;

sizeof(workers)=20

8+4+4+4(位结构体的大小应为最大成员的整数倍)

位结构体成员叫位域,注意事项:

1. 一个位域必须存储在同一个字节中,不能跨两个字节

struct bs

{

unsigned a:4

unsigned :0 /*空域*/

unsigned b:4 /*从下一单元开始存放*/

unsigned c:4

}

在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

2.位域不允许越过定义它的数据类型

3.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的

struct k

{

int a:1

int :2 /*该2位不能使用*/

int b:3

int c:2

};

#includevoid main()

{

union

{

struct student

{

unsigned char s1:1;

unsigned char s2:3;

}x;

unsigned char c;

}v;

v.c=0;

v.x.s1=0;

v.x.s2=4;

printf("%d\n",v.c);

printf("%d\n",sizeof(struct student));

}

8(小端模式)

1

64(大端模式)

1

本题小结:

像intel的CPU是小端模式:

若左边是低位,右边是高位(不定),

如上面的例子中s1(0)比s2(100)先执行,先执行的一定是放低位,但s2的要反过来写(即001),在内存中表现为0 001,因为电脑是以字节为单位的,字节占八位,即后面四位补零,得:0001 0000,再有,小端模式是从高位读到低位的,即从右往左读,结果就是8;

像摩托罗拉的CPU是大端模式:

若左边是低位,右边为高位(自定),

如上面的例子中s1(0)比s2(100)先执行,先执行的一定是放低位,s2的不要反过来写(即100),在内存中表现为0 100,因为电脑是以字节为单位的,字节占八位,即后面四位补零,得:0100 0000,再有,大端模式是从低位读到高位的,即从左往右读,结果就是64;

#includevoid main()

{

union

{

struct student

{

unsigned char s1:1;

unsigned char s2:2;

unsigned char s3:2;

}x;

unsigned char c;

}v;

v.c=0;

v.x.s1=0;

v.x.s3=2;

printf("%d\n",v.c);

printf("%d\n",sizeof(struct student));

}

16(大小端都是)

1

转载地址:https://blog.csdn.net/weixin_32637935/article/details/116787289 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux如何把新的硬盘加入PV,[原创] 在Linux下给主机添加新的硬盘空间
下一篇:Linux内存堆的空闲列表结构,ctfwiki笔记--Linux堆相关结构

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月30日 15时38分05秒