C语言:位结构体

article/2025/10/15 2:46:50

位结构体是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构体比按位运算符更加方便。


一、位结构—简介

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。
例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。
为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。
所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

二、位结构—定义

1. 声明位结构体类型

一般形式具体如下:

struct 位结构体名
{数据类型 变量名: 整型常数;数据类型 变量名: 整型常数;
};

说明:

  • 数据类型必须是unsigned和signed可修饰的类型(char,short,int,long)。
  • 变量名是选择项, 可以不命名, 这样规定是为了排列需要。
  • 整型常数必须是非负的整 数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。

2. 定义位结构体变量

举例说明如下:

struct bit
{int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14位
}temp;

注意:

  1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
  2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 如果是指针, 其成员访问方式同结构指针。
  3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字节。
  4. 位结构成员可以与其它结构成员一起使用。

三、位结构—使用方法

位结构体变量的赋值和一般结构体赋值的方法是一样的。
初始化定义时—赋值

struct bit
{int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14位
}temp={1,3,6,10,26};

初始化后—赋值

	temp.a=1;temp.b=3;temp.c=6;temp.d=10;temp.e=26;

位结构体的使用说明举例如下:

#include <stdio.h>struct bit
{int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14,15位
}temp={1,3,6,10,26};int main(int argc, char *argv[])
{int i=*((int*)&temp);printf("0x%x\n",i);return 0;
}

运行结果如下:

0x6ab7

解释说明:

变量15 14 13 12 11 109 8 7 65 4 32 10
a(1)1
b(3)1 1
c(6)110
d(10)1010
e(26)011010

结果是0b0110101010110111=0x6ab7

四、位结构和共用体联合使用

具体程序如下:

#include <stdio.h>typedef union 
{int  data;struct {int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14,15位}bit;
}_MQ; _MQ mq=
{.bit.a = 1,.bit.b = 3,.bit.c = 6,.bit.d = 10,.bit.e = 26
};int main(int argc, char *argv[])
{printf("data=0x%x\n",mq.data);return 0;
}

运行结果如下:
在这里插入图片描述



http://chatgpt.dhexx.cn/article/i0wEmuMI.shtml

相关文章

C 语言编程 — 构造数据类型 — 结构体(struct)

目录 文章目录 目录结构体声明一个结构体类型定义一个结构体类型的变量定义一个结构体类型的指针变量结构体的成员结构体的内存分布 结构体 结构体&#xff08;Structure&#xff09;是一种由不同类型的数据成员组成的数据类型。通过定义结构体&#xff0c;我们可以将多个不同…

C语言结构体和其他构造数据类型详解

结构体和其他构造数据类型 结构体 “结构”是一种构造类型&#xff0c;它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既然是一种“构造”而成的数据类型&#xff0c;那么说明和使用之前必须先定义它&#xff0c;也就是构造它。 结…

C的实用笔记38——结构体的引入和定义

1.为什么要用结构体&#xff1f; 0、原因&#xff1a;实际开发中&#xff0c;我们需要将不同类型的数据组合成一个整体&#xff0c;这就是结构体。结构体是自创的类型。 1、查找一名学生信息的两种方案&#xff1a;在EXCEL表格和数据库中经常有这种情况&#xff0c;比方说一个…

7.IDA-创建结构体

结构体分类 结构体的一个显著特点在于&#xff0c;结构体中的数据字段是通过名称访问&#xff0c;而不是像数组那样通过索引访问。不好的是&#xff0c;字段名称被编译器转换成了数字偏移量。结果&#xff0c;在反汇编代码清单中&#xff0c;访问结构体字段的方式看起来与使用…

结构体的初步认识以及其内存的计算

目录 前言 结构体的定义 结构体的自引用 结构体的初始化 结构体内存的计算 前言 我们知道&#xff0c;通过不同的数据类型我们可以表达不同意义的数据&#xff0c;如长度宽度面积只需要定义一个 int 类型的数据就可以符合大部分的需求。但是&#xff0c;有些东西自存在就是一…

IDA创建结构体方法

1. ida是最好用的逆向分析工具 2.问题 如果你在使用IDA分析时遇到大量的结构体指针偏移形式的变量&#xff0c;肯定想根据自己的分析重命名结构体各项。 3.定义结构体 这是需要先找到结构体初始化的地方 这里记录了每一项的偏移量&#xff0c;记录了结构体总大小Ox110uLL。 …

手把手教你写单片机的结构体

手把手教你写单片机的结构体 摘要&#xff1a;听说还有好多学单片机的小伙伴不会用结构体&#xff1f;指针和结构体是学单片机必须要掌握的&#xff0c;如果你C语言掌握的不牢&#xff0c;单片机根本学不到精髓&#xff0c;只能完成一些低级的项目。看得懂结构体并且能够灵活运…

STM32基于Flash对结构体读写暨再认识结构体内存分配

目录 前言 认识结构体内存分布 模拟结构体搬运 实现FLASH的结构体读写 前言 记录本篇主要是记录我进行stm32学习中利用stm32的flash&#xff08;闪存&#xff09;读写结构体的总结。 认识结构体内存分布 结构体&#xff0c;主要要来存放我们的自定义类型的数据&#xff0c;结…

单片机的结构体

手把手教你写单片机的结构体 FROM8号线攻城狮 公众号 电子信息工程硕士在读&#xff0c;分享单片机、嵌入式linux、物联网等知识&#xff0c;致力于打造最硬核的嵌入式技术公众号。 半碗鸡汤&#xff0c;半碗杂粮。 摘要&#xff1a;听说还有好多学单片机的小伙伴不会用结构…

windows下mysql初始密码设置

转载自&#xff1a;http://blog.csdn.net/ofreelander/article/details/50802780 1.my-default.ini 改名my.ini 在解压的目录下面复制my-default.ini一份改名字为 my.ini。 2.打开 Windows 环境变量设置, 新建变量名 MYSQL_HOME , 变量值为 MySQL 安装目录路径, 在 环境变量 …

MYSQL修改初始化密码的方法

解决方法之一&#xff1a; “ ALTER USER rootlocalhost identified by 123456 ; ” 最近安装了mysql&#xff0c;在使用“ set password for rootlocalhostpassword(123456);”时会遇到 “ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that…

Centos下安装mysql查看初始密码并修改密码

题记&#xff1a;当我们在centos成功安装了mysql后&#xff0c;需要查看初始密码&#xff0c;大概率也需要自己修改密码。 一&#xff0c;查看mysql历时密码 cat var/log/mysqld.log二&#xff0c;进入到mysql mysql -u root -p按回车&#xff0c;然后再password:输入刚才所…

MySQL设置初始密码—注意版本mysql-8.0.30

MySQL设置初始密码—注意版本mysql-8.0.30 第一步&#xff1a;使用管理员模式下的命令行&#xff0c;进入mysql的所在文件下的bin目录; 第二步&#xff1a;输入命令mysql -u root -p; 第三步&#xff1a;这里第一次不用输入密码; 第四步&#xff1a; ALTER USER rootlocalhost…

安装mysql的初始密码在哪里

mysql初始密码是多少 介绍怎么找到mysql安装的root的初始密码 mysql初始密码是多少 介绍怎么找到mysql安装的root的初始密码 怎么给mysql设置用户名和密码 登录数据库 “命令提示字符”窗口录入&#xff0c; 录入cd C:\mysql\bin 并按下回车键&#xff0c;将目录切换为 cd C:\m…

关于MySQL初始化密码忘记的问题

本文章可以解决MySQL密码忘记的问题&#xff01;&#xff01;&#xff01; 1、到mysql安装的bin目录下运行PowerShell 2、在命令行输入 mysql -u root -p 登录 mysql&#xff0c;可以随意输入一个密码&#xff0c;返回”ERROR 1045 (28000): Access denied for user rootlocal…

mysql安装,以及初始化密码

1.首先下载 mysql安装包&#xff0c; 我这里下载的mysql 5.7(免安装版) https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-winx64.zip 然后解压到你自己的目录中&#xff0c;我这里为 D 盘下&#xff1a; 此处&#xff0c;下下来的压缩包里面&#xff0c; data 目…

mysql初始没有密码怎么设置

由于本人是win7的忠实用户&#xff0c;最近被win10所吸引索性换了系统&#xff0c;还是改不了恋旧的习惯。所以用的mysql还是5.6。进入正题 在装完mysql并且配置完环境变量之后发现密码为空 1.首先进入到你安装的目录下&#xff0c;这里我的是E盘 2.之后输入mysql -u root -p …

1、数据库-MySql

什么是数据库 数据库(DataBase,简称DB) 概念&#xff1a;长期存放在计算机内&#xff0c;有组织&#xff0c;可共享的大量数据的集合&#xff0c;是一个数据"仓库" 作用&#xff1a;保存&#xff0c;并能安全管理数据(如:增删改查等)&#xff0c;减少冗余… 数据…

C++中字符串大小写字母转换

最近在学习 STL&#xff0c;string 也是 STL 中的一种容器&#xff0c;遇到一个字符串中字母大小写转换的例子&#xff0c;这里就顺便总结一下在C中常用的字符串大小写转换方法&#xff0c;有需要的可以参考。代码如下&#xff1a; 1、char[]类型&#xff0c;调用库函数 // …

大小写字母转换(java大小写字母转换)

苹果4SQQ密码大小写字母怎么转换不&#xff1f;苹果4SQQ密码大小写字母 每次要输密码,当时在电脑上设置的密码,可以改变大小写,但是到了手机上,我不知道怎么换大小写,那位朋友告诉下 苹果手机输入法怎么改字母的大小写 (很高兴为您解答,有帮助请给好评,谢谢! ) 大小写转换-键盘…