赣州企业网站建设,o2o商超网站建设,网站开发英文参考文献,家纺网站模板目录 1.什么是位段#xff1f;
别急#xff01;在下面第二点我和大家介绍。
2.位段的内存怎么分配#xff1f;
还有一种情况就是两种类型夹杂在一起的位段
3.位段的跨平台问题
4.位段能干嘛#xff1f;#xff08;应用#xff09;
5.位段的注意事项 1.什么是位段
别急在下面第二点我和大家介绍。
2.位段的内存怎么分配
还有一种情况就是两种类型夹杂在一起的位段
3.位段的跨平台问题
4.位段能干嘛应用
5.位段的注意事项 1.什么是位段 1. 位段的成员必须是 int 、 unsigned int 或 signed int 在C99中位段成员的类型也可以 选择其他类型。 2. 位段的成员名后边有⼀个冒号和⼀个数字。例如如下 struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};
int main()
{printf(%d\n, sizeof(struct A));return 0;
} 打印出来为8说明这里有8个字节上面有4个int 不应该是12个字节吗 别急在下面第二点我和大家介绍。 2.位段的内存怎么分配 1. 位段的成员可以是 int unsigned int signed int 或者是 char 等类型 2. 位段的空间上是按照需要以4个字节 int 或者1个字节 char 的⽅式来开辟的。 3. 位段涉及很多不确定因素位段是不跨平台的注重可移植的程序应该避免使⽤位段。 struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};
int main()
{printf(%d\n, sizeof(struct A));return 0;
} 还是这串代码首先冒号后面的数字其实规定的是这个int 变量能占到的二进制位。 一个int 有 4个字节 32个二进制位比特位。后面的数字相当于位宽占的二进制位 位段相当于本来一个 int 4个字节但比如_a 你给了它两个比特位那么它就只有两个比特位 位段开辟的空间是根据你的类型开辟的一个int 4个字节那就直接开辟4个字节的空间 但不同的是 如果你的一个变量位宽不能等于这个类型的二进制位int有32个大小时那后面的变量会根据位宽 与前面 的变量紧紧的存储到一起就像a b c 三个变量其实占了 2510个二进制位他们加起来其实是存在了一个2个字节中。但如果加上d 30 就大于了32.这样是存不下的所以得在开辟4个字节的空间所以 最终打印出来为448个字节。中间的2个字节其实是浪费了。下面有个例子可以好好看我也会给出讲解 同时记住结构体的大小为最大对齐数的整数倍 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; a 的 二进制 0001010 b 的 二进制 0001100 c 的 二进制 0000011 d 的 二进制 0000100 然后根据他们的位段的位宽进行截断 a 截3位b 4位 c 5位 d 4位。 十六进制的 1位 等于 二进制的4位。最后算出内存中存储的是十六进制的 62 03 04. 还有一种情况就是两种类型夹杂在一起的位段
struct S
{char a : 3;int b : 4;char c : 4;char d : 4;
}; 如果位段中间出现不同类型的位段其实会强制终止前一个位段的内容。 即第一个变量 a 开辟了 1个字节 后续的5个二进制位就不要了重新开辟4个空间给 int b变量。b变量只用了4个二进制位后续的二进制位也不在被占用而是直接跳过后面的所有二进制位给 char c 变量开辟新的 一个字节空间。因为 c d 8所以它们公用一个字节。 3.位段的跨平台问题 1. int 位段被当成有符号数还是⽆符号数是不确定的。 2. 位段中最⼤位的数⽬不能确定。16位机器最⼤1632位机器最⼤32写成27在16位机器会 出问题。 3. 位段中的成员在内存中从左向右分配还是从右向左分配标准尚未定义。 4. 当⼀个结构包含两个位段第⼆个位段成员⽐较⼤⽆法容纳于第⼀个位段剩余的位时是舍弃剩余的位还是利⽤这是不确定的 总结 跟结构相⽐位段可以达到同样的效果并且可以很好的节省空间但是有跨平台的问题存在。 4.位段能干嘛应用 下图是⽹络协议中IP数据报的格式我们可以看到其中很多的属性只需要⼏个bit位就能描述这⾥ 使⽤位段能够实现想要的效果也节省了空间这样⽹络传输的数据报⼤⼩也会较⼩⼀些对⽹络 的畅通是有帮助的。 5.位段的注意事项 因为位段他的部分不是一个一个字节存放所以位段存放的数据不能用字节的方法来更改。 所以不能对位段的成员使⽤操作符这样就不能使⽤scanf直接给位段的成员输⼊值只能是先输⼊ 放在⼀个变量中然后赋值给位段的成员。 不能直接更改位段变量的数据只能间接更改 struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};
int main()
{struct A sa { 0 };scanf(%d, sa._b);//这是错误的//正确的⽰范int b 0;scanf(%d, b);sa._b b;return 0;
}