返回信息流如果大家在网上查阅位域的相关知识,必然会有以下注意点:
由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
那么,这个说法是否妥当?我感到相当怀疑,所以我来补充下我的理解。
先看下面的有人问的代码:
struct mybitfields
{
unsigned short a : 4;
unsigned short b : 5;
unsigned short c : 7;
}test;
void main(void)
{
int i;
test.a=2;
test.b=3;
test.c=0;
i=*((short *)&test);
printf("%d\n",i);
}
如果按照上面的注意点,这个结果不应该是0x32.那么真相到底如何?
答曰:
位域的长度不能够超过所定义类型的长度
具体可以参见http://blog.csdn.net/jiyucn/archive/2006/07/01/862085.aspx
请大家务必注意!
这是一条镜像帖。来源:北邮人论坛 / cpp / #30748同步于 2009/11/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【注意】关于位域的一点重要说明
jmpesp
2009/11/2镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
你的重要声明本身就有问题,每个位域不能跨两个字节,所以位域的长度不能大于两个字节。另外微机使用的c系统中一般是按照c b a分配的,即0000000 00011 0010
【 在 bingshan0424 的大作中提到: 】
: 你的重要声明本身就有问题,每个位域不能跨两个字节,所以位域的长度不能大于两个字节。另外微机使用的c系统中一般是按照c b a分配的,即0000000 00011 0010
你自己多想想去,我就不多说了~~
上网搜了一下,发现如下说法:
C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,
允许其它类型类型的存在。
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字
段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字
段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方
式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
【 在 Wing 的大作中提到: 】
: 上网搜了一下,发现如下说法:
: C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,
: 允许其它类型类型的存在。
: ...................
恩,你总结得还是挺全面的。感觉这些知识点虽然简单,但是很容易出错。
小弟 在这里 还是没怎么搞明白 位域 与 大小端的关系。
不知道 楼上大牛们能不能帮忙解释一下?
为什么这两个 成员 要颠倒位置呢?他们不是在同一字节内的吗?
struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN
u_char ip_hl:4, /* header length */
ip_v:4; /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
u_char ip_v:4, /* version */
ip_hl:4; /* header length */
#endif
...
};
【 在 jmpesp 的大作中提到: 】
: 如果大家在网上查阅位域的相关知识,必然会有以下注意点:
: 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
: 那么,这个说法是否妥当?我感到相当怀疑,所以我来补充下我的理解。
: ...................
【 在 devc 的大作中提到: 】
: 小弟 在这里 还是没怎么搞明白 位域 与 大小端的关系。
: 不知道 楼上大牛们能不能帮忙解释一下?
: 为什么这两个 成员 要颠倒位置呢?他们不是在同一字节内的吗?
: ...................
在对struct中的成员进行分配的时候,"按排列顺序分配,先分配排在前面的"
(1)big endian从高位向低位分配,
a. 对字节,是先分配高地址的字节,再分配低地址的字节。
b. 对位域,先分配most significant bits,再分配least significant bits。
(2)little endian从低位向高位分配,
a. 对字节,是先分配低地址的字节,再分配高地址的字节。
b. 对位域,先分配least significant bits,再分配most significant bits。
谢谢楼上 大牛, 有点思路了。
不过你的那俩 a. 是copy 的吧? 第一个a 貌似反了?
补充 一份 新 搜到的资料... 讲的很详细...
http://www.linuxjournal.com/node/6788/print
【 在 devc 的大作中提到: 】
: 谢谢楼上 大牛, 有点思路了。
: 不过你的那俩 a. 是copy 的吧? 第一个a 貌似反了?
: 补充 一份 新 搜到的资料... 讲的很详细...
: ...................
你连copy都看出来了啊,嘿嘿。我改一下~~
【 在 devc 的大作中提到: 】
: 谢谢楼上 大牛, 有点思路了。
: 不过你的那俩 a. 是copy 的吧? 第一个a 貌似反了?
: 补充 一份 新 搜到的资料... 讲的很详细...
: ...................
已经把那个链接做成pdf文档,大家可以看下~~