c/c++位字段

2023-11-06

 

位字段

 

 

定义

位字段是C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数。

所有基础的数据类型, 最大的也不过 10 个字节;

我们可以自定义的数据类型 -- struct, 通过把若干类型组合在一起, 让一种类型可以大很多.

我们知道, 一个字节有八个 Bit 组成; struct中的 "位字段" 是以 Bit 为单位的, 这已经是计算机的最小单位, 大小是 char 类型的 1/8.

 

用途

它主要用于一些使用空间很宝贵的程序设计中,如嵌入式程序设计。

 

要点

1.C语言允许unsigned int类型,signed int类型或int类型的位字段,分别称为无符号位段,带符号位字段和普通位字段。和普通字符一样,普通位字段可以无符号或带符号。C99允许_Bool类型的位字段。 

考虑下面标准C语言声明在采用对二的补码为编码方式的计算机中的效果:

 

 

struct S
{
    unsigned a:3;
    signed b:3;
    int c:3;
}t = {-1, -1, -1};

 

 此时t.a,t.b,t.c的值分别为7,-1,-1。

 

 

2. 位字段的存储方式:即是用"高位优先",还是"低位优先"。采用位字段的程序,由于存储方式不同,程序是不可移植的。

 

3.无名位字段

结构中,还可以包括一个无名位字段,提供相邻成员之间的填充,强制结构体按word对齐。

 

4.包含位字段的结构和其他结构没有区别, 譬如同时包含其他类型的字段:

 

 

 

#include <stdio.h>

struct Bit
{
	unsigned b1: 1;
	unsigned b2: 1;
	float f;
}B;

int main(void)
{
  B.b1 = 0;
  B.b2 = 1;
  B.f = 3.14;

  printf("%d, %d, %g\n", B.b1, B.b2, B.f);

  return 0;
}

 

 

示例1

 

 

#include <stdio.h>

struct Bit
{
	unsigned a: 1; /* 1 Bit, 取值范围: 0 - 1 */
	unsigned b: 2; /* 2 Bit, 取值范围: 0 - 3 */
	unsigned c: 3; /* 3 Bit, 取值范围: 0 - 7 */
	unsigned d: 4; /* 4 Bit, 取值范围: 0 - 15 */
}B;

int main(void)
{
  B.a = 1;
  B.b = 3;
  B.c = 7;
  B.d = 15;

  printf("%d, %d, %d, %d\n", B.a, B.b, B.c, B.d);

  return 0;
}

 

 

示例2

 

 

#include <stdio.h>

struct Bit
{
	int b8: 1;
	int b7: 1;
	int b6: 1;
	int b5: 1;
	int b4: 1;
	int b3: 1;
	int b2: 1;
	int b1: 1;
}B;

int main(void)
{
  unsigned char *p = NULL;

  B.b1 = 1; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
  p = (unsigned char *)&B;
  printf("%d\n", *p); /* 255 */

  B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 0; B.b6 = 0; B.b7 = 0; B.b8 = 1;
  p = (unsigned char *)&B;
  printf("%d\n", *p); /* 1  */

  B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
  p = (unsigned char *)&B;
  printf("%d\n", *p); /* 15 */

  B.b1 = 0; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1;
  p = (unsigned char *)&B;
  printf("%d\n", *p); /* 127 */

  return 0;
}
 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c/c++位字段 的相关文章

  • C#中unsafe的使用

    1 unsafe在C 程序中的使用场合 实时应用 采用指针来提高性能 引用非 net DLL提供的如C 编写的外部函数 需要指针来传递该函数 调试 用以检测程序在运行过程中的内存使用状况 2 使用unsafe的利弊 好处是 性能和灵活性提高
  • C/C++语言实现WiFi(socket)数据收发(客户端和服务端)

    目录 客户端 client 服务端 server C C 实现TCP通信 接收WIFI数据 编程环境 VC 6 0 手机端 使用WiFi调试助手 提示 整个过程在局域网中进行 很多编程语言都可以实现socket通信 本博客将通过C C 实现
  • 侯捷系列:c++面向对象高级编程(上)

    文章目录 基于对象的程序设计 不带有指针成员变量的类 以复数类 Complex 为例 头文件的结构 访问级别 函数设计 内联函数 构造函数 常量成员函数 参数的值传递和引用传递 返回值的值传递和引用传递 友元 操作符重载 在类内声明 pub
  • 范围for语句

    C 新标准提供的范围for语句 这种语句遍历给定序列中个元素并对序列中每一个值执行某种操作 其语法形式是 for declaration expression statement 其中 expression 部分是一个对象 用于表示一个序列
  • 调用拷贝构造函数的几种情况(附面试题)

    1 深拷贝和浅拷贝 拷贝构造函数的使用 有时候需要自己定义拷贝构造函数 以避免浅拷贝问题 在什么情况下需要用户自己定义拷贝构造函数 一般情况下 当类中成员有指针变量 类中有动态内存分配时常常需要用户自己定义拷贝构造函数 在什么情况下系统会调
  • 五. python面向对象(多态 和metaclass=abc.ABCMeta)

    一 多态 多肽 一种事物的多种形态 叫多肽 例如 动物 animal 猫 狗 animal py 文件 动物类 都有名字这个属性 和吃这个方法 class Animal object def init self name self name
  • 解决“17: 错误:程序中有游离的‘\240’,\302’

    参考链接 https blog csdn net asuphy article details 54602426 执行如下命令即可 sed i s o240 o302 g dy haikang test cpp
  • 编写程序模拟完成动态分区存储管理方式的内存分配和回收。

    usr bin python coding utf 8 class Table object 空闲分区表 0 开始地址 1 长度 freeTable 占用分区表 0 程序名 1 开始地址 2 长度 useTable def init sel
  • c/c++入门教程 - 1.基础c/c++ - 1.0 Visual Studio 2019安装环境搭建

    推荐视频课程 https www bilibili com video BV1et411b73Z p 2 已投币三连 b站果然是个学习的网站 本来是想在linux环境下运行QT 于是先学了几个月linux嵌入式驱动开发 后来发现太底层了 与
  • c++得到窗口句柄

    include
  • C/C++ 引用作为函数的返回值

    语法 类型 函数名 形参列表 函数体 特别注意 1 引用作为函数的返回值时 必须在定义函数时在函数名前将 2 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 代码来源 RUNOOB include
  • 【C++】VS code如何配置使用C++(手把手教学)

    博 主 米码收割机 技 能 C Python语言 公众号 测试开发自动化 获取源码 商业合作 荣 誉 阿里云博客专家博主 51CTO技术博主 专 注 专注主流机器人 人工智能等相关领域的开发 测试技术 VS code如何配置使用C 手把手教
  • 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)<转>

    干货 Chrome插件 扩展 开发全攻略 不点进来看看你肯定后悔 写在前面 我花了将近一个多月的时间断断续续写下这篇博文 并精心写下完整demo 写博客的辛苦大家懂的 所以转载务必保留出处 本文所有涉及到的大部分代码均在这个demo里面 h
  • dev-c++官网位置和源码/库位置

    1 http devpaks org 2 http www bloodshed net 3 http www bloodshed net dev 转载于 https www cnblogs com vilyLei articles 1812
  • 为何在新建STM工程中全局声明两个宏

    在uVision中新建STM32工程后 需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中 此时需要在工程设置 gt C C 选项卡下的Define文本框中键入这两个全局宏定义 STM32F40 41xxx USE STDPERIP
  • lua和测试(一)

    lua做为一门高级语言 在游戏产业运用到机会越来越多了 测试掌握几门脚本语言也有一定的重要性 以下对于lua组合输入做出一些引导 测试需要掌握的关于返回数值 主要用到布尔类 前言的指引 lua的语法比较简单和清晰 学过c语言的可以很好的掌握
  • mfc窗口创建的create与oncreate

    在view类中 create 是虚函数由框架调用 是用来 生成一个窗口的子窗口 oncreate 消息响应函数 是用来 表示一个窗口正在生成 某个CWnd的Create函数由当前CWnd的Owner调用 而在CWnd Create中 又会调
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • 在 OS X 上的 virtualenv 中安装 scrapy 加密时发生错误 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在安装 scrapypip in virtualenv on OS X 10 11 当它安装密码学时 它说 buil
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我

随机推荐

  • VMware15安装及Linux环境搭建教程

    VMware15安装及Linux环境搭建教程 A 软件安装 B 新建虚拟机环境 附加题 C 文件与网络 文件设置 网络设置 对于很多计算机类专业的学生来说 经常有在Linux系统上进行开发的需要 本文介绍了如何利用VMware在Window
  • js数组常用方法

    JavaScript是一种高级编程语言 广泛应用于Web开发 在JavaScript中 数组是一种常用的数据类型 它可以用来存储一组值 这些值可以是任何类型 包括数字 字符串 对象等 JavaScript数组提供了许多强大的操作方法 可以帮
  • jmeter学习所采的坑

    1 jdk安装是32位与jmeter版本不兼容 jdk安装是32位 jmeter5 4 1 卸载jdk安装64后问题解决 2 jmeter安装后保存不了测试计划 解决方案 各种百度 最后在选项 外观 选择windows 可以保存测试计划 3
  • (代码审计)zzcms存储型XSS

    1 漏洞成因是stripfxg 函数引起的 先来看看这个函数 inc function php function stripfxg string htmlspecialchars decode false nl2br false 去反斜杠
  • flask mvc模式开发_MVC设计模式

    MVC的全名是Model View Controller 是模型 Model 视图 view 控制器 controller 的缩写 是一种设计模式 它是用一种业务逻辑 数据与界面显示分离的方法来组织代码 将众多的业务逻辑聚集到一个部件里面
  • RuntimeError: Error(s) in loading state_dict for BASE_Transformer

    最近跑一个深度学习变化检测的项目BIT CD 严格按照作者的说明页进行训练和测试 但是跑出来的模型就是无法正常工作 而用作者的预训练模型就正常工作 百思不得其解 根据错误 逐步调试 输出 总算是找到了问题的所在 其实这个问题如果对于老手 估
  • 全面解析大语言模型的工作原理

    当ChatGPT在去年秋天推出时 在科技行业乃至世界范围内引起了轰动 当时 机器学习研究人员尝试研发了多年的语言大模型 LLM 但普通大众并未十分关注 也没有意识到它们变得多强大 如今 几乎每个人都听说过LLM 并有数千万人用过它们 但是
  • 3D模型的渲染,这一篇就够了

    3D模型的渲染 这一篇就够了 效果图及源码 1 mapbox 2 threebox tube line logistics raycaster mercator object3D 效果图及源码 1 mapbox https docs map
  • ORACLE(student)表习题与答案

    1 查询Student表中的所有记录的Sname Ssex和Class列 SELECT sname ssex class FROM student 2 查询教师所有的单位即不重复的Depart列 SELECT distinct depart
  • 集中式日志存储架构

    Hello大家好 欢迎回来 我们今天的视频课程要讨论的内容是 AWS的集中式日志存储架构 包括集中式日志存储架构需要考虑的事项 以及使用了两个AWS账户对架构的实现做了个快速的演示 我们开始今天的内容 集中式日志存储架构 当前 在绝大多数组
  • 对话力码科技:保险科技应用有待深入,价值落地更重要

    保险行业的数字化时机已来 更加专业化的企业才能立于不败之地 数科星球原创 作者丨苑晶 编辑丨大兔 对于国内的大多数企业来说 2023年是个极为重要的年份 在软件行业 随着人工智能等新技术的日益成熟和普及 软件行业迎来黄金时代 在这种趋势下
  • 多点双向重发布

    实验题目 要求 1 两个协议间进行多点双向重发布 2 R7的环回没有宣告在OSPF协议中 而且是后期重发布进去 3 解决环路 所有路径选择最优 且存在备份 实验拓扑图 IP地址与ospf和rip的配置 R1 int g0 0 0 ip ad
  • 华为OD机试真题-计算网络信号 【2023.Q1】

    题目内容 网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网络信号值 注意 网络信号可以绕过阻隔物 array m n 的二维数组代表网格地图 array i j 0代表i行j列是空旷位置 array i
  • 开源协议比较:BSD、Apache、GLP、LGLP、MIT

    BSD开源协议 original BSD license FreeBSD license Original BSD license BSD开源协议是一个给于使用者很大自由的协议 基本上使用者可以 为所欲为 可以自由的使用 修改源代码 也可以
  • Python报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte的最新解决办法2022-09-30

    合并txt文件内容时候 Python报错UnicodeDecodeError gbk codec can t decode byte 这个错误是做NLP的小伙伴常见的一个错误 报错原因是读取的文件中有中文 网上找到的解决办法 将 with
  • ProtocolBuffers-3.0.0 For Objective C 的快速集成指南

    一 前言 最近调研 Google的Protocol Buffer 在网上看了几篇相关博客 发现他们讲的都比较复杂 所以就想写一篇简单点的文章 配置环境 mac OS 10 11 5 Xcode7 3 二 Protocol Buffer简介
  • 汉诺塔(Tower of Hanoi)--------递归思路

    汉诺塔问题简介 有三根相邻的柱子 标号为A B C A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘 要把所有盘子一个一个移到柱子C上 并且每次移动 同一根柱子上都只能是大盘子在下 小盘子在上 请问至少需要多少次移动 汉诺塔问题分析 1
  • 剑指 Offer 57. 和为s的两个数字--双指针问题

    这道题有点像之前一道用hashmap做的乱序数组求两数之和等于指定数的问题 两数相加 时间复杂度小于 O n2 而今天这道题 用hashmap也可以做出 但是空间复杂度实在太大 又因为它是排序好的数组 所以二分法或者双指针法比较简单 双指针
  • DRF视图组件

    目录 视图 APIView APIView与View的不同之处 GenericAPIView 通用视图类 类属性 类方法 基于APIView写五个接口 基于GenericAPIVIew写5个接口 五个视图扩展类 ListModelMixin
  • c/c++位字段

    位字段 定义 位字段是C语言中一种存储结构 不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数 所有基础的数据类型 最大的也不过 10 个字节 我们可以自定义的数据类型 struct 通过把若干类型组合在一起 让一种类型可以大很多