- 论坛徽章:
- 0
|
1.结构体一:
typedef struct
{
unsigned x_bit : 3;
unsigned y_bit : 3;
unsigned z_bit : 2;
char w[3];
} SAM_BIT;
定义:
SAM_BIT sam_bit;
初始化:
sam_bit.x_bit = 7;
sam_bit.y_bit = 5;
sam_bit.z_bit = 3;
memset(sam_bit.w, 0x0, 3);
查看内存:
&sam_bit : 0x F7 00 00 00; 0xF7(111 101 11)
&sam_bit : 0x EF 00 00 00; 0xEF(11 101 111)
当然这是不同的系统造成了不同的值,即不同的系统中位字段的存储方式不同。
前一种一般是Motorla机器上的存储结果,从左向右存储,称之为高位存储;
後一种是Intel机器上的存储结果,从右向左存储,称之为低位存储。
由此说来,位字段不具有可移植性。
为使其具有可移植性,应该使用位运算,而避免定义位字段的结构体。
2.结构体二:
typedef struct
{
unsigned x_bit : 9;
unsigned y_bit : 20;
unsigned z_bit : 3;
} SAM_BIT;
定义:
SAM_BIT sam_bit;
初始化:
sam_bit.x_bit = 0x1AA;
sam_bit.y_bit = 0xEEEEE;
sam_bit.z_bit = 0x7;
若是Intel机器,查看内存:
&sam_bit : 0x AA DD DD FD;
为什么会是此值,我的理解是:
首先遵循小端字节序的原则,将x_bit中的0xAA存于第一个字节,然后由y_bit的低7位与x_bit的高1位构成第二个字节0x 1101110 1,由此第3字节为0x11011101,第4字节为0x 111 11101.
只是自己的推测,望达人指点。
在此主要是想说一下位字段的存储方式,与大伙探讨下,位运算想必大伙都明白,故不做说明了
最后还是那句话,尽量用位运算代替位字段,使其具有可移植性。 |
|