您的位置:首页 > 其它

位域与大小端

2016-04-29 14:49 369 查看


C中的位域与大小端问题(整理自网上资料)

字节内也是有大小端问题,与字节中的大小端类似:

1)little endian中的位应该这样排列:

01234567

即排在前面的是低位。因此,先分配least significant bits

2)而在Big endian中,位应该这样排列:

76543210

即排在前面的是高位。因此,先分配most significant bits。
在对struct中的成员进行分配的时候,"按排列顺序分配,先分配排在前面的"

1)big endian从高位向低位分配,

a. 对字节,是先分配低地址的字节,再分配高地址的字节。

b. 对位域,先分配most significant bits,再分配least significant bits。

1)little endian从低位向高位分配,

a. 对字节,是先分配低地址的字节,再分配高地址的字节。

b. 对位域,先分配least significant bits,再分配most significant bits。

对于定义如下的结构体:

struct yaabou_com{

int a:1;

int b:2;

int c:3;

int d:4;

int e:5;

int f:6;

int g:11;

};

大端:

地址:[00000000][00000001][00000002][00000003]

数据:|abbcccdd||ddeeeeef||fffffggg||gggggggg|

小端:

地址:[00000000][00000001][00000002][00000003]

数据:|ddcccbba||feeeeedd||gggfffff||gggggggg|

所以如果大端定义了上面的结构体,小端要定义相反的结构体:

struct yaabou_com{

int g:11;

int f:6;

int e:5;

int d:4;

int c:3;

int b:2;

int a:1;

};

所以,一定要做网络字节序转换!

结构体中位域的定义:

在使用中为了兼容大小端,结构体的定义总是区分了大小端情况:

结构体A描述了在一个字节(byte)内,位域大小端的定义方式——小端将字节内的定义顺序翻转即可;结构体B描述了在一个字(word)内位域的定义方式——小端将一个字内的定义顺序全部翻转,在使用前需要先调用ntohl宏进行转换。

struct A{

#ifdef BIG_ENDIAN

ucharq:4;

uchark:4;

#else

uchark:4;

ucharq:4;

#endif

}

struct B{

#ifdef BIG_ENDIAN

int a:1;

int b:2;

int c:3;

int d:4;

int e:5;

int f:6;

int g:11;

#else

int g:11;

int f:6;

int e:5;

int d:4;

int c:3;

int b:2;

int a:1;

#endif

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: