什么是位段?
位段的声明和结构是类似的,有两个不同:
1.
位段的成员必须是char,
int
、
unsigned int
或
signed int
。
2.位段的成员名后边有一个冒号和一个数字
位段的内存分配?
1.
位段的成员可以是
int unsigned int signed int
或者是
char
(属于整形家族)类型
2.
位段的空间上是按照需要以
4
个字节(
int
)或者
1
个字节(
char
)的方式来开辟的。
3.
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
struct S {
char a:3;
char b:4;
char c:5;
char d:4;
};
struct S s = {0};
s.a = 10; s.b = 12; s.c = 3; s.d = 4;
前提在vs编译中
a开辟一个字节,剩余5位,b是4位小于5位,所以a和b占一个字节。c占5位>1,这1位舍弃。
c又开辟一个字节,剩3位,d是4位大于3位,这3位舍弃。d自己又开辟一个字节,一共3个字节。
位段的缺陷?
1. int
位段被当成有符号数还是无符号数是不确定的。
2.
位段中最大位的数目不能确定。(
16
位机器最大
16
,
32
位机器最大
32
,写成
27
,在
16
位机
器会出问题。
3.
位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4.
当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的