位域

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

struct 位域结构名 
{位域列表};

其中位域列表的形式为:

类型说明符 位域名位域长度

位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:

struct bs
{int a:8;int b:2;int c:6;
}data; 

说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:


1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:

struct bs
{unsigned a:4unsigned b:5 /*从下一单元开始存放*/unsigned c:4
}

2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度

3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

struct k
{int a:1int :2 /*无位域名,该2位不能使用*/int b:3int c:2
}; 
二、位域的使用
#include <iostream>
#include <memory.h>
using namespace std;
struct A
{int a:5;int b:3;
};
int main(void)
{char str[100] = "0134324324afsadfsdlfjlsdjfl";struct A d;memcpy(&d, str, sizeof(A));cout << d.a << endl;cout << d.b << endl;return 0;
}

解析:在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体里面最长的元素为对其单位,即结构体的长度一定是最长的数据元素的整数倍;如果有结构体内存长度大于处理器位数的元素,那么就以处理器的位数为对齐单元。由于是32位处理器,而且结构体中a和b元素类型均为int(也是4个字节),所以结构体的A占用内存为4个字节。

上例程序中定义了位域结构A,两个个位域为a(占用5位),b(占用3位),所以a和b总共占用了结构A一个字节(低位的一个字节)。

当程序运行到14行时,d内存分配情况:

高位 00110100 00110011   00110001    00110000 低位'4'       '3'       '1'          '0'  其中d.a和d.b占用d低位一个字节(00110000),d.a : 10000, d.b : 001

 d.a内存中二进制表示为10000,由于d.a为有符号的整型变量,输出时要对符号位进行扩展,所以结果为-16(二进制为11111111111111111111111111110000)

 d.b内存中二进制表示为001,由于d.b为有符号的整型变量,输出时要对符号位进行扩展,所以结果为1(二进制为00000000000000000000000000000001)

 

转载于:https://www.cnblogs.com/13224ACMer/p/6298764.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字后端——ECO

目录 一、概述 二、ECO分类 1、按时间节点 1&#xff09;流片前的ECO 2&#xff09;流片过程的ECO 3&#xff09;流片后的ECO 2、按网表是否改变 1&#xff09;功能ECO 2&#xff09;时序ECO 三、ECO处理内容 1、设计规则违例 1&#xff09;提升标准单元驱动力 2…

Uncaught TypeError: Cannot read property 'length' of null错误怎么处理?

Uncaught TypeError: Cannot read property length of null 错误怎么处理&#xff1f; 1.可能是返回的datagrid数据格式有问题&#xff0c;比如{"total":0,"rows":null}&#xff0c;改为{"total":0,"rows":"[]"}就可以了 if…

电视百科常识 九大视频接口全接触

1 射频 天线和模拟闭路连接电视机就是采用射频&#xff08;RF&#xff09;接口。作为最常见的视频连接方式&#xff0c;它可同时传输模拟视频以及音频信号。RF接口传输的是视频和音频混合编码后的信号&#xff0c;显示设备的电路将混合编码信号进行一系列分离、解码在输出成像。…

tracert路由检测命令使用方法

很多客户网站无法访问的时候都会第一时间怀疑是虚拟主机有问题了&#xff0c;其实大多时候网站无法访问和很多因素相关&#xff0c;包括自己的网络、计算机设置、省际路由等等&#xff1b; 那么这里我就简单讲下如何利用DOS下的命令检测你的计算机到服务器之间的路由是否通畅&a…

数字后端——物理单元介绍

物理单元&#xff08; physical cell&#xff09;指没有逻辑功能但是具有物理实现功能的标准单元&#xff0c; 用于抑制芯片生产过程中的各类物理效应&#xff0c; 保证芯片生产后能够正常工作 。硬核位置确 定后&#xff0c;需要插入物理单元消除影响芯片工作的物 效应&#x…

vue双向数据绑定的原理

有关双向数据绑定的原理 最近两次面试的时候&#xff0c;被问到了vue中双向数据绑定的原理&#xff0c;因为初学不精&#xff0c;只是使用而没有深入研究&#xff0c;所以答不出来。之后就在网上查找了别人写的博客&#xff0c;学习一下。 下面是博客园一篇博客&#xff0c;以及…

求职网站总结

最近忙着要找份工作。毕业半年多就辞职&#xff0c;也是尴尬。 这里记录一些求职网站和找工作的一些经验。主要参考了三个知乎问题&#xff1a;怎么在互联网上找工作&#xff1f;&#xff0c;招聘网站&#xff0c;哪个靠谱&#xff1f;和哪个求职网站&#xff08;app&#xff0…

FTP命令解析

FTP命令详解FTP命令是Internet用户使用最频繁的命令之一&#xff0c;不论是在DOS还是UNIX操作系统下使用FTP&#xff0c;都会遇到大量的FTP内部命令。熟悉并灵活应用FTP的内部命令&#xff0c;可以大大方便使用者&#xff0c;并收到事半功倍之效。   FTP的命令行格式为&…

深入Java内存模型

你可以在网上找到一大堆资料让你了解JMM是什么东西&#xff0c;但大多在你看完后仍然会有很多疑问。happen-before是怎么工作的呢&#xff1f;用volatile会导致缓存的丢弃吗&#xff1f;为什么我们从一开始就需要内存模型&#xff1f; 通过这篇文章&#xff0c;读者可以学习到足…

Matlab 使用GPU加速 转载

在matlab中使用GPU加速&#xff0c;来加速矩阵运算。 首先如前面所说&#xff0c;并不是所有GPU都能在maltab中进行加速的&#xff0c;貌似只有NVDIA的显卡可以吧。 硬件&#xff1a;GeForce GTX 980 软件&#xff1a;Matlab 2015a &#xff08;Matlab 2012以后的版本才带有GP…

数字后端——可制造性设计

随着集成电路制造工艺技术的迅速发展&#xff0c;集成电路集成度迅速攀升&#xff0c;制造流程及工艺步骤日趋复杂&#xff0c;工艺尺寸也在不断缩小。集成电路可制造性设计&#xff08;Design For Manufacturability,DFM&#xff09; 以直接提升集成电路芯片的良品率及降低芯片…

Cloudstack安装(二)

Cloudstack安装 官方文档参考&#xff1a; http://docs.cloudstack.apache.org/projects/cloudstack-installation/en/4.9/qig.html#environment Cloudstack主要分Management和Agent两部分。 系统版本&#xff1a;CentOS 6.8 Management&#xff1a; cpu1&#xff0c;ram 2048M…

Pycharm 输出中文或打印中文乱码现象的解决办法

转载地址&#xff1a;https://www.cnblogs.com/Bro-Young/p/5920884.html 1. 确保文件开头加上以下代码&#xff1a; 1 # -*- coding:utf-8 -*- 还可以加上 1 import sys 2 reload(sys) 3 sys.setdefaultencoding(utf-8) 确保以下。 如果还是没有解决中文乱码&#xff0c;那么进…

计算机系统结构——概述

计算机的实现包括两个方面&#xff1a;组成和硬件。组成一词包含了计算机设计的高阶内容&#xff0c;例如存储器系统&#xff0c;存储器互连&#xff0c;设计内部处理器 CPU &#xff08;中央处理器——算术、逻辑、分支和数据传送功能都在内部实现&#xff09;。有时也用微体系…

BestCoder Round #91 1001 Lotus and Characters

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid6011 题意&#xff1a; Lotus有nn种字母&#xff0c;给出每种字母的价值以及每种字母的个数限制&#xff0c;她想构造一个任意长度的串。 定义串的价值为&#xff1a;第1位字母的价值*1第2位字母的价值*2第3位字…

Calendar的那些神坑

参考我的博客&#xff1a;http://www.isedwardtang.com/2017/08/31/java-calendar-bug/转载于:https://www.cnblogs.com/EdwardTang/p/7476781.html

mkyaffs2image的用法

在Ubuntu中第一次使用mkyaffs2image命令时&#xff0c;会提示 mkyaffs2image&#xff1a;找不到命令 还需要安装mkyaffs2image http://code.google.com/p/fatplus/downloads/detail?nameyaffs2-source.tar&can2&q 下载yaffs2-source.tar 解压后&#xff0c;进入util…

全景图像拼接——基本流程

图像拼接技术是数字图像处理技术一个重要的研究方向,它即是将两幅或多幅相互有部分重叠的场景照片拼接成具有超宽视角、与原始图像接近且失真小、没有明显缝合线的高分辨率图像。可以很好地解决广角镜、鱼眼镜头等全景图获取设备的不足。如下图: 图像拼接产生的图像不…

SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换

SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换 前言 如果能够进行以太坊和比特币跨链原子资产交换&#xff0c;是不是一件很酷的事情&#xff1f; 目前链下的扩容方式有很多&#xff0c;最广为人知的就是比特币的闪电网络和以太坊的雷电网络&#xff0c;今天我…

WPF 带CheckBox、图标的TreeView

WPF 带CheckBox、图标的TreeView 在WPF实际项目开发的时候&#xff0c;经常会用到带CheckBox的TreeView&#xff0c;虽然微软在WPF的TreeView中没有提供该功能&#xff0c;但是微软在WPF中提供强大的ItemTemplate模板功能和自定义样式&#xff0c;那我们可以自己写一个这样的控…