您的位置:首页 > 其它

C中的位域与大小端问题

2015-07-08 14:43 399 查看
大小端是数据在内存中存放的两种顺序。

大端:

是指先从高(大)地址分配内存。

小端:

是指先从低(小)地址分配内存。

所以,对于int型数值0×12345678的保存方式如下:

(假设保存在0开始的地址中)

CPU先存数据的低位。

大端:

地址:[00][01][02][03]

数值: 12 34 56 78

小端:

地址:[00][01][02][03]

数值: 78 56 34 12

对于C中的位域,也是同样的原理。

对于定义如下的结构体:

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;

};

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

上面还有一个问题,对于小端来说,g是如何存放的呢?

如下:

小端:

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

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

位: |________||________||________||1_______|

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