C中的位域与大小端问题
来源:互联网 发布:大数据专业相关培训 编辑:程序博客网 时间:2024/05/18 00:54
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
};
- C中的位域与大小端问题
- C中的位域与大小端问题
- C中的位域与大小端问题
- C中的位域与大小端问题
- c语言中的大小端问题与高低位问题
- 位域与大小端问题
- C位域与大小端字节序 间关系
- 位域与大小端
- 位域与大小端
- 位域与大小端
- 大小端,以及位域问题。
- bit 位域大小端转换问题
- 位域操作与大小端
- C语言中的位域、字节序、比特序、大小端
- C语言中的位域、字节序、比特序、大小端
- C语言中的位域、字节序、比特序、大小端
- C语言中的位域、字节序、比特序、大小端
- C语言中的位域、字节序、比特序、大小端
- 【Linux版】Mongodb的安装、主从配置、replicaSet配置
- redhat/ubuntu 配置apache, mysql自启动
- png图片结构分析与加密解密原理
- namenode format做了些什么
- linux 创建连接命令 ln -s 软链接
- C中的位域与大小端问题
- 多文档视图的实现
- Android之PowerManager电源管理
- HDU 4160 最小路径覆盖 = 顶点数 - 最大匹配数 二分匹配
- 什么是重构,什么不是重构
- 国行诺基亚Lumia 1520价格或为4999元
- NSLog输出格式
- 文档视图框架操作总结
- NodeJS Express+ MongoDB 开发详细教程 含安装