【C语言】位段

news/2024/7/9 4:16:09

位段

一.简介

位段和结构体很相似。不同的是:

  1. 位段的成员:成员名 : 数字
  2. 且其成员必须是整型(char、int、unsigned int……)

示例:

struct S
{
    char a : 3;
    char b : 2;
    char c : 7;
};

S就是一个位段类型,其成员a为占3个比特位的char类型变量(即有效范围为000~111),相同的,b为占2个比特位的char类型变量,c为占7个比特位的char类型变量。

由此可见,位段的设计初衷就是为了节约空间的

二.不易移植性

不同平台下对于位段的处理不同,因此使用位段可能存在跨平台问题

  1. 位段的空间以1个字节1个字节(或4个字节4个字节)的方式开辟
  2. int类型的成员变量被当成有符号还是无符号数是不确定的
  3. 给变量所占(比特位)大小的数字范围不能确定,(比如在16位机器中,一个int占2个字节,如果是int a : 17的话就超出范围就会出错的)
  4. 位段的大小不确定:位段中成员在内存中从左向右或从右向左左分配;如果第二个成员需要的比特位空间大于上一个成员使用某个字节后的剩余空间,那么这些剩余空间是否被利用不确定。

三.内存分配

下面代码主要是为了展现不同编译器对于位段的处理,代码本身无实际意义(非位段使用场景示例)

1.在vs下测试

在这里插入图片描述

在这里插入图片描述

可以发现在vs下,对于位段S,是按4个字节4个字节开辟了8个字节的空间。

成员a的3个比特位空间分配在第1个字节并且按照从右向左(←)分配;

成员b的2个比特位空间被分配在第1个字节的剩余位且按照从右向左分配;

第1个字节剩余3个比特空间 < 成员c所需要的7个比特,舍弃剩余的3个比特空间,c的5个比特的空间被分配在第2个字节处;

对于int类型的成员d,其被分配在后4个字节处。

对位段成员进行赋值时,超出给位段的二进制数值会被舍弃


2. 在gcc下测试

在这里插入图片描述

在这里插入图片描述

可以发现在gcc下,位段S所占的空间更小,只有4个字节大小。

在gdb调试下,位段S的内存内存分配如上图。

所以在不同平台下,对位段的编译处理是不同的

🦀🦀观看~


http://lihuaxi.xjx100.cn/news/951810.html

相关文章

一直在说高并发,多少QPS才算高并发?

高并发的四个角度 只说并发不提高可用就是耍流氓。可以从四个角度讨论这个问题。 首先是无状态前端机器不足以承载请求流量&#xff0c;需要进行水平扩展&#xff0c;一般QPS是千级。 然后是关系型数据库无法承载读取或写入峰值&#xff0c;需要数据库横向扩展或引入nosql&am…

Linux->进程终止和等待

目录 1. 进程终止场景 1.1 进程退出码 1.2 进程常见退出方式 2. 进程等待 2.1 进程等待的必要性 2.2 进程等待的方式 wait()方式 waitpid()方式 options参数 status参数 1. 进程终止场景 代码运行完毕&#xff0c;结果正确 代码运行完毕&#xff0c;结果不正确 代码异…

Python基础用法

Python基础用法(1) 输出Hello World 在Python中&#xff0c;使用print函数可以输出文本到控制台&#xff0c;例如&#xff1a; print("Hello World")这个程序会输出一个简单的"Hello World"到控制台。 变量 Python中的变量可以存储任何类型的值&#…

如何用AST还原某音的JSVMP

1. 什么是JSVMP vmp简单来说就是将一些高级语言的代码通过自己实现的编译器进行编译得到字节码&#xff0c;这样就可以更有效的保护原有代码&#xff0c;而jsvmp自然就是对JS代码的编译保护&#xff0c;具体的可以看看H5应用加固防破解-JS虚拟机保护方案。 如何区分是不是jsv…

趣味三角——第13章——地图师的乐园

第13章节 地图师的乐园(A Mapmaker’s Paradise) What’s the good of Mercator’s North Poles and Equators, Tropics, Zones and Meridian Lines? So the Bellman would cry: and the crew would reply, “They are merely conventional signs!” (Mercator的北极和赤…

DockerHub 仓库中的原生 PostgreSQL 镜像操作说明(一)原文翻译

原生的 PostgreSQL 镜像的制作还是比较合理的&#xff0c;推荐大家深入研究这个镜像的使用操作&#xff0c;能熟悉构建脚本最好不过。 原文链接&#xff1a;https://hub.docker.com/_/postgres 如何使用这个镜像 启动一个 postgres 实例 $ docker run --name some-postgres …

【python 基础篇 十】python的函数-------函数的基本使用

目录1.函数的概念2.函数的基本使用3.函数的参数3.1 单个参数3.2 多个参数3.3 不定长参数3.4 缺省参数3.5 参数注意4.函数的返回值1.函数的概念 概念 ​ 写了一段代码实现了某个小功能&#xff1b;然后把这些代码集中到一块&#xff0c;起一个名字&#xff0c;下一次就可以根据这…

Android --- logcat 打印日志、设置缓存大小、过滤等

一、示例&#xff1a;setprop persist.log.tag -G setprop persist.log.tag V setprop persist.log.tag S setprop persist.log.tag.APP_A V setprop persist.log.tag.App_B V setprop persist.log.tag.App_C V setprop persist.log.tag.AndroidRuntime VAndroid log 通过系统…