首页 > 其他分享 >C 结构体中的位域概念

C 结构体中的位域概念

时间:2024-03-09 16:47:46浏览次数:16  
标签:int unsigned 概念 体中 位域 bit3 bit2 data2

位域

一、基本概念

1.1 位域的概念

结构体中的冒号表示位域,如:

struct bit_struct
{
    unsigned int  bit1:10;
    unsigned int  bit2:8;
    unsigned int  bit3:14;
} data1; // sizeof data1 = 4

struct bit_struct
{
    unsigned int  bit1:10;
    unsigned int  bit2:8;
    unsigned int  bit3:16;
} data2; // sizeof data2 = 8

位域出现的原因是由于某些信息的「存储表示」只需要几个 bit 位就可以表示,而不需要一个完整的字节,同时也是为了节省存储空间和方便处理。

1.2 说明

  1. 位域必须存储在同一个类型中,不能跨类型,同时也说明位域的长度不会超过所定义类型的长度。如果一个定义类型单元里所剩空间无法存放下一个域,则下一个域应该从下一单元开始存放。
    如 data2,所定义的类型是 unsigned int 类型,一共 32 位,bit1 和 bit2 用掉了 18bit,还剩下 \(32-18=14bit\),这时要存储一个 16bit 的位域元素 bit3,那么这个元素就只能从下一个 unsigned int 类型的单元开始而不会在前面一个unsigned int 类型中占 14bit 后面的 unsigned int 类型中占 2bit。

  2. 如果位域的位域长度为0表示是个空域,同时下一个域应当从下一个字节单元开始存放。

  3. 使用无名的位域来作为填充和调整位置,切记该位域是不能被使用的。

  4. 位域的本质上就是一种结构体类型,不同的是其成员是按二进制位来分配的。

二、代码理解

#include <stdio.h>
#include <string.h>

struct bit_struct_1
{
    unsigned int  bit1:10;
    unsigned int  bit2:8;
    unsigned int  bit3:14;
} data1; // sizeof data1 = 4

struct bit_struct_2
{
    unsigned int  bit1:10;
    unsigned int  bit2:8;
    unsigned int  bit3:16;
} data2; // sizeof data2 = 8


/*
 0001 1001 0010 1010 1011 0011 0100 1111 0101 1101 0110 1100 0111 1110 1000 1011
 ————————— ————————— ————————— ————————— ————————— ————————— ————————— —————————
    19        2A        B3        4F         5D        6C       8E        9B
    高 <-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·- 低
*/
int main()
{
    unsigned long long ullNum = 0x192AB34F5D6C7E8B;
    memcpy(&data1, (void *)&ullNum, sizeof(data1));
    memcpy(&data2, (void *)&ullNum, sizeof(data2));

    printf("data1 size is %d\n", sizeof(data1));  /* size is 4 */
    printf("[1] bit1 : %u\n", data1.bit1);          /* 651  --> 1010001011 */
    printf("[1] bit2 : %u\n", data1.bit2);          /* 31   --> 00011111 */
    printf("[1] bit3 : %u\n", data1.bit3);          /* 5979 --> 01011101011011 */

    puts("------------------------");
    printf("data2 size is %d\n", sizeof(data2));  /* size is 8 */
    printf("[2] bit1 : %u\n", data2.bit1);          /* 651   --> 1010001011 */
    printf("[2] bit2 : %u\n", data2.bit2);          /* 31    --> 00011111 */
    printf("[2] bit3 : %u\n", data2.bit3);          /* 45903 --> 1011001101001111 */

    return 0;
}

上述代码中我们定义了一个 8B 的 ullNum,其二进制表示如下图所示:

image-20240309161334183

从低字节到高字节分别分配给 bit1、bit2、bit3 :

image-20240309162313180

参考资料

标签:int,unsigned,概念,体中,位域,bit3,bit2,data2
From: https://www.cnblogs.com/hyacinthLJP/p/18062904

相关文章

  • WPF多数类概念性注册加自动扫描
    在java中springboot的配置应用了自动扫描@ComponentScan(value={"com.example","com.fox"})而对于Asp.NetCore可以使用ScrutorstaticvoidMain(string[]args){varcollection=newServiceCollection();collection.Scan(action=>......
  • docker镜像分层概念
          ......
  • 数据挖掘概念与技术 - chapter 8 - 分类:基本概念
    分类是一种重要的数据分析形式,提取刻画重要数据类的模型。分类器:用预测类标号数据分类:学习阶段(构建分类模型)与分类阶段(使用模型预测给定数据的类标号)训练集:由数据库元组和与它们相关联的类标号组成。元组X用n维属性向量X=(x1,x2,...,xn)表示。分别描述元组在n个数据库属性A1,A2,.......
  • flutter入门1——概念简介
    简介Flutter是Google开发的一个开源移动应用框架,用于构建高性能、高保真的跨平台应用。它使用Dart语言作为开发语言,具有许多独特的特点和优势。特点跨平台性:Flutter支持Android和iOS两大主流移动平台,开发者可以使用同一套代码库来构建应用,大大减少了开发和维护的成本。高性能......
  • 第1章 基本概念
    协议族:一系列相关协议的集合称为一个协议族。协议族的体系结构或参考模型:指定一个协议族中的各种协议之间的相互关系并划分需要完成的任务的设计,称为协议族的体系结构或参考模型。TCP/IP:是一个实现Internet体系结构的协议族。TCP/IP体系结构来源于实际工作,用于满足多种不同的分......
  • AI蠕虫是一种虚构的概念,结合了人工智能(AI)和计算机病毒蠕虫(worm)两个概念
     AI蠕虫是一种虚构的概念,结合了人工智能(AI)和计算机病毒蠕虫(worm)两个概念。在现实中,并没有被证实存在真正的AI蠕虫。AI蠕虫通常被描述为一种具有自我学习和自我复制能力的恶意软件,它能够利用人工智能算法进行自我演化和适应,以更有效地传播和感染目标系统。这种想象中的恶意软件......
  • 数据挖掘概念与技术 - chapter 6 - 挖掘频繁模式、关联与相关性:基本概念与方法
    ***关联推荐!频繁模式:频繁地出现在数据集中的模式,给出数据集中反复出现的联系。频繁序列模式:如有序购买一系列产品频繁结构模式:如组合购买产品sample购物篮分析:通过发现顾客放入他们购物篮中的商品之间的关联,分析顾客的购物习惯,这种关联度发现可以帮助零售商在哪些商品频繁......
  • Java的基本概念
    Java的工作方式:你写出一个应用程序,能够在你朋友的任何产品上执行1.程序员编写源代码2.源代码通过编译器(编译器检查代码是否错误,如果错误,则需要进行更改)3.源代码没有错误则进行输出,编译器将源代码编译成字节码,任何支持Java的装置都可以转译成可执行内容4.通过Java虚拟机(JVM)进......
  • MySQL锁系列(一)之锁的种类和概念
    原文链接https://keithlan.github.io/2017/06/05/innodb_locks_1/背景锁是MySQL里面最难理解的知识,但是又无处不在。一开始接触锁的时候,感觉被各种锁类型和名词弄得晕头转向,就别说其他了。本文是通过DBA的视角(非InnoDB内核开发)来分析和窥探锁的奥秘,并解决实际工作当中遇到的问......
  • git原理性概念
    参考资料近期学习git内部概念及原理,为了加强效果和日后回忆,还是写了这篇笔记进行输出。参考资料如下:这才是真正的Git——Git内部原理-LZANE|李泽帆(靓仔)《VersionControlwithgit》实验环境:unbuntu18objects(blobstreecommitstag)&hashgit里的object有四种:tree......