C语言【位段篇】

简介: 前言:相信大家写题的时候,都会遇到这种问题:这个专业名词是什么?不知道,算了,不做了(反正也不是能力问题)位段这个名词就很常见,接下来,砸门来聊一聊有关位段的这些事

1.什么是位段

位段的结构和声明和结构体是类似的,有两个不同:

1.位段的成员必须是整形家族(int、unsigned int、signed int或者是char)

2.位段的成员名后边有一个冒号和数字


🌰


struct S
{
  int a : 5;
  int b : 7;
  int c : 30;
};
//S就是一个位段类型

那我们就有疑问了:

位段为甚么是这种的结构(:数字),这样做的好处是什么?位段S的大小是多少?

那么我们带着这样的疑问进入到下一部分。


2.位段的内存分配

位段中的 位 是 “二进制位”

一般一个位段类型里面的成员都是一个类型的


有了前面的知识铺垫,我们就知道了:位段中冒号后面的数字是给这个成员分配的比特位。以上面的例子而言:a就分配了5个比特位,b分配了7个比特位,c分配了30个比特位

在上面的例子中,位段在内存中是以四个字节开始分配的(因为每一个成员都是int)

44e0a374801448f183539e2b79add4f0.png4cdf62a2d12c4ad986c8455e82da766a.png


那么我们就有一个疑问:上一个四个字节没用完,那么又开辟了四个字节,还用不用上一个存留的比特位呢?

这个问题,C语言中并没有明确的规定,这是取决于编译器的。

那么,我们来看看在VS编译器中的情况是怎么样的:

🌰


#include<stdio.h>
struct S
{
  char a : 3;
  char b : 4;
  char c : 5;
  char d : 4;
};
int main()
{
    struct S s = { 0 };
    s.a = 10;
    s.b = 12;
    s.c = 3;
    s.d = 4;
    return 0;
}

3a645ee06ff24936a7be7d822849f763.png

57c2fafdeb6545e6998dc0adafc7c6c7.png


3.位段的跨平台问题

那照这样来说:位段的结构和作用都和结构体一样,而且更节省空间一些。

以后我们不用结构体,直接用位段多好,答案是no!no!no!


让我们来看看位段的一些缺陷与不足:


int 位段被当成有符号数还是无符号数是不确定的。

位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。

位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在

6a7117c443334396885103482c4d850d.png


相关文章
|
6月前
|
存储 编译器 C语言
C语言位域
C语言位域
49 0
|
6月前
|
存储 C语言
c语言中的共用体
c语言中的共用体
48 0
|
6月前
|
存储 编译器 C语言
C语言共用体
C语言共用体
44 0
|
存储 C语言
20 C语言 - 共用体
20 C语言 - 共用体
42 0
|
存储 C语言
【C语言】位段详解
【C语言】位段详解
95 0
|
3月前
|
编译器 程序员 Linux
【C语言篇】结构体和位段详细介绍
跟结构相⽐,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。
43 3
|
6月前
|
存储 网络协议 C语言
C语言——详解位段
C语言——详解位段
49 0
C语言——详解位段
|
6月前
|
存储 网络协议 编译器
C语言从入门到实战——结构体与位段
C语言中的结构体是一种自定义的数据类型,可以用来表示多个不同类型的数据的集合。结构体是由多个变量组成的,每个变量称为结构体的成员。 使用结构体需要先定义结构体类型,然后可以声明该类型的变量。
51 0
|
6月前
|
C语言
【C语言】结构体实现位段
对位段进行介绍,什么是位段,位段如何节省空间,位段的内存分布,位段存在的跨平台问题,及位段的应用。
43 0
|
存储 编译器 C语言
21 C语言 - 位域
21 C语言 - 位域
34 0