- 浏览: 298280 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (272)
- java (42)
- c (49)
- 算法 (29)
- 汇编语言 (3)
- 字符集 (3)
- error (3)
- 搜索引擎 (2)
- 互联网 (18)
- linux (12)
- 网络 (20)
- VMWare (1)
- 面试 (7)
- c++ (55)
- 设计模式 (3)
- db (9)
- office (2)
- FS (1)
- rest (3)
- Ajax (2)
- Spring (2)
- Hibernate (3)
- matlab (1)
- load balancing (8)
- 分布式计算 (2)
- 易语言 (1)
- apache tomcat (1)
- 测试 (1)
- 数据结构 (5)
- 数学 (13)
- 服务器 (9)
- 读后感 (4)
- 好书介绍 (1)
- script (3)
- wordpress (2)
- delphi (21)
- pascal (8)
- xml (3)
- 趣味 (1)
- PHP (3)
- python (13)
- DLL (4)
- openGL (8)
- windows (2)
- QT (28)
- django (7)
- jquery (1)
- 数据挖掘 (7)
- nginx (1)
- js (1)
- mac (1)
- hadoop (3)
- 项目管理 (1)
- 推荐系统 (1)
- html (1)
最新评论
-
晴天1234:
related remove:attention.ibus和u ...
UBUNTU的默认root密码是多少,修改root密码 -
美丽的小岛:
美丽的小岛 写道如上配置好就得了。提示没有OpenGl.dll ...
OpenGL学习入门之VS2010环境配置 [转] -
美丽的小岛:
如上配置好就得了。提示没有OpenGl.dll之类的,再增加入 ...
OpenGL学习入门之VS2010环境配置 [转] -
美丽的小岛:
主要是理清哪两个对象之间的关系,是信号与所有槽的关系或者是槽与 ...
QT之DisConnect -
美丽的小岛:
LPCTSTR类型:L表示long指针 这是为了兼容Windo ...
QString与各种字符串之间的转化
学习C有些时间了,知道有结构体,但是偶然知道它还有位结构体,查了些资料,也做了一个实验。
1.概念性描述:
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。
位结构定义的一般形式为:
struct 位结构名{
数据类型 [变量名]: 整型常数; //成员称为“位域”或者“位段”
数据类型 [变量名]: 整型常数;
} 位结构变量;
其中: 数据类型必须是整型(int/char/short)。 整型常数的范围是数据类型的长度, 如定义为short,则范围是1~16。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct webpage{
unsigned char incon: 8; /*incon占用低字节的0~7共8位*/
unsigned char txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned char bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned char blink: 1; /*blink占用高字节的第7位*/
}ch;
printf("%d\n",sizeof(struct webpage));输出:2。
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor
注意:
1. 一个位域必须存储在定义它的一个数据类型内部,不能跨跨该数据类型。如char定义的位域所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
2.由于位域不允许越过定义它的数据类型,因此位域的长度不能大于定义它的数据类型的长度。
3. 位结构总长度(位数), 是各个位成员定义的位数之和再向最大结构成员对齐。
4. 位结构成员可以与其它结构成员一起使用。
2.写下面的代码
#include "stdio.h" int main() { union { struct student { unsigned char s1:3; unsigned char s2:3; unsigned short s3:3; }x; unsigned short s; unsigned int i ; }v; v.i=0; v.x.s1=1; v.x.s2 =8; v.x.s3=1; printf("v.i = %d\n",v.i); printf("v.s = %d\n",v.s); printf("v.x.s1 = %d\n",v.x.s1) ; printf("v.x.s2 = %d\n",v.x.s2) ; printf("v.x.s3 = %d\n",v.x.s3) ; v.s = 0x10A ; printf("v.i = %d\n",v.i); printf("v.s = %d\n",v.s); printf("v.x.s1 = %d\n",v.x.s1) ; printf("v.x.s2 = %d\n",v.x.s2) ; printf("v.x.s3 = %d\n",v.x.s3) ; printf("size:%d\n",sizeof(v)); return 0 ; }
3.得出下面的结果
4.作以下的分析
上面的结构中都是3个3个的,用九位来分析,v.i=0;语句形成图1的情况,除了这9位还有23位都是0 :
图1:
+----+----+----+----+----+----+----+----+----+
| s3 | s2 | s1 |
+----+----+----+----+----+----+----+----+----+
| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
+----+----+----+----+----+----+----+----+----+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+----+----+----+----+----+----+----+----+----+
经过v.x.s1=1,v.x.s2 =8;v.x.s3=1;这三个赋值后,就变成了图2的的那样了。图2了,打印出来也看到了。果真是这样的。
+----+----+----+----+----+----+----+----+----+
| s3 | s2 | s1 |
+----+----+----+----+----+----+----+----+----+
| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
+----+----+----+----+----+----+----+----+----+
| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
+----+----+----+----+----+----+----+----+----+
对于这个语句v.s = 0x10A ;的赋值,想看看联合体中的元素是不是共用一块内存,看到的果然也在意料之内。0x10A的二进制就是下面的9位所显示的。打印出来也是意料的那样。
图3:
+----+----+----+----+----+----+----+----+----+
| s3 | s2 | s1 |
+----+----+----+----+----+----+----+----+----+
| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
+----+----+----+----+----+----+----+----+----+
| 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
+----+----+----+----+----+----+----+----+----+
最后还打印出来整个字联合体大小为4,这个是int型决定的字节数。
5.参考:
http://hi.baidu.com/wliangde/item/e00d0b37cf3c57dd6c15e9ee
发表评论
-
vs2008【断点无效】解决方法
2015-04-13 10:05 747有时候,我们在用vs2008调试的时候,会出现断点无效。如下 ... -
C++模板之特化与偏特化详解
2015-01-07 14:44 791转自:http://www.jb51.net/a ... -
c++中的typename与class<转>
2015-01-07 08:51 795在泛型编程的形参表中,关键字typename和class具有 ... -
traits:Traits技术初探
2015-01-06 12:49 761概述:traits是一种特性萃取技术,它在Generic ... -
POD型别
2015-01-06 12:37 735POD全称Plain Old Data。通俗的讲,一个类或结 ... -
c++核心基础知识(内存管理)
2015-01-04 22:22 668内存管理是C++最令人切 ... -
内存分配器<转>
2015-01-04 22:07 1350题记:内存管理一直 ... -
operator new在C++中的各种写法
2015-01-04 19:27 1166http://blog.sina.com.cn/s/blo ... -
可变参数va_list
2014-12-26 17:45 8541.要在函数中使用参数,首先要包含头文件<stdarg ... -
map注意的两个问题
2014-12-11 14:21 602代码1 void main() { ... -
关于C++ const 的全面总结<转>
2014-11-14 12:56 725C++中的const关键字的用法非常灵活,而使用const ... -
C++DLL编程详解
2014-10-08 19:44 1571DLL(Dynamic Link Library)的 ... -
C++&&QT调试时出现的一些错误
2014-10-08 15:14 757错误 原因 解决 ... -
【转】C++ function、bind以及lamda表达式
2014-09-11 09:42 846本文是C++0x系列的第四篇,主要是内容是C++0x中新增 ... -
STL函数对象及函数对象适配器【转】
2014-09-10 09:24 468一 函数对象Functor STL中提供了一元和 ... -
typedef和typename关键字[转]
2014-09-10 09:21 6611、类型说明typedef 类型说明的格式为: type ... -
C/C++中extern关键字详解[转]
2014-09-09 11:38 4731 基本解释:extern可以置于变量或者函数前,以标示变量 ... -
MYSQL在C—API 中可用的函数
2014-08-24 23:03 570mysql_affected_rows() 返 ... -
C & C++的编译
2014-08-12 09:21 484C/C++编译过程 C/C++编 ... -
C++全局变量的声明和定义
2014-08-11 20:51 400(1)编译单元(模块 ...
相关推荐
结构体可以看做是C语言中的类 但是结构体中不能封装函数,只能有数据成员 这个程序演示了如何像c++的类一样在结构体中增加函数 如果有错误,欢迎交流
描述:为了解决java与C结构通信过程中结构体解析问题。 主要功能:能友好的用java处理任何发送的C结构体对象,并且能发送java对象转换成C结构体接收的二进制。 功能说明 1、基于spring框架开发 2、对于结构体定义...
C语言之结构体详细讲解,电子教程,ppt教程,C语言——结构体
C语言利用结构体数组实现学生成绩管理系统.doc
// 定义一个表示时间的结构体,可以精确的表示年、月、日、小时、分、秒,提示用户输入年、月、日、小时、分、秒的值,然后完整的显示出来。
C语言用结构体实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系...
5.1 为什么需要循环控制 5.2 用while语句实现循环 5.3 用do---while语句实现循环 5.4 用for 语句实现循环 5.5 循环的嵌套 5.6 几种循环的比较 5.7 改变循环执行的状态 5.8 循环程序举例
c语言词典结构体匹配法,qsort与bsearch
C语言结构体共2页.pdf.zip
深入解析JNA—模拟C语言结构体
有的时候,我们所遇到的数据结构,不仅仅是一群数字或者是 ...现,这个时候,我们就得上更高端的装备——结构体。 相比于数组,结构体有以下的更强大的优势: 批量存储数据 存储不同类型的数据 支持嵌套
C语言-结构体及测试代码
定义结构体类型 定义结构体类型变量 引用结构体变量 给结构体变量赋值 结构体的嵌套 结构体数组 指向结构体类型变量的指针
C语言——结构体的读取与写入.zip
详解C语言Struct(结构体)系列的第一部分的全部文章合集,具体分析文章见: http://blog.csdn.net/column/details/structure.html 第二季近期会很快提供
所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。本文档用例子描述了C结构体位域的应用,简单易懂,相信初学者很快就能掌握。
C语言的结构体大小计算
C语言结构体与共用体,C语言结构体与共用体的使用方法介绍
简单的C语言结构体范例代码,需要的可以拿走参考一下
这是一个C语言从实验报告,主要涉及到的是C语言的共用体和结构体