`
美丽的小岛
  • 浏览: 312274 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

C的位结构体

    博客分类:
  • c
c 
阅读更多

 学习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

  • 大小: 5.4 KB
1
2
分享到:
评论

相关推荐

    java 与C语言传递结构体数据

    描述:为了解决java与C结构通信过程中结构体解析问题。 主要功能:能友好的用java处理任何发送的C结构体对象,并且能发送java对象转换成C结构体接收的二进制。 功能说明 1、基于spring框架开发 2、对于结构体定义...

    如何在C语言的结构体中像类一样封装函数

    在C语言中,尽管结构体是用来组织数据的一种方式,它本身并不支持直接在其中定义或封装函数,就像C++中的类。然而,通过巧妙地利用函数指针,我们可以模拟类的面向对象特性,实现类似的功能。下面将详细介绍如何在...

    结构体的使用c语言练习题

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个新的类型。这种新类型可以包含整型、浮点型、字符型等基本类型,甚至是其他结构体类型。结构体在处理复杂数据时非常有用...

    深入解析JNA—模拟C语言结构体

    ### 深入解析JNA—模拟C语言结构体 #### 前言 在《JNA—JNI终结者》一文中介绍了Java Native Access (JNA) 的基本使用方法及其优势,但当时并未深入探讨如何在Java中模拟C语言中的结构体(structure)。结构体在C语言...

    C语言结构体共2页.pdf.zip

    "C语言结构体共2页.pdf.zip"可能包含关于结构体的基本概念、定义、初始化、指针操作以及结构体数组和结构体指针的使用等内容。下面将详细介绍这些知识点。 1. **结构体定义**: 在C语言中,我们可以通过`struct`...

    C语言利用结构体数组实现学生成绩管理系统.doc

    C语言利用结构体数组实现学生成绩管理系统 本文主要介绍了使用C语言利用结构体数组来实现学生成绩管理系统的设计和实现。该系统可以管理某班的学生成绩,实现了十个主要功能:录入每个学生的学号、姓名和各科考试...

    C语言使用结构体实现简单通讯录

    C语言用结构体实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系...

    C语言结构体.ppt

    C语言结构体类型 C语言结构体类型是一种复杂的数据类型,它允许用户建立一种集不同数据类型于一体的数据构造类型。结构体类型的定义需要在程序中自己建立所需的结构体类型,包括成员的声明,每个成员所具有的数据...

    C语言-结构体及测试代码

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将不同类型的数据组合到一个单一的实体中,便于管理和操作。结构体是C语言中非常重要的一个特性,它为程序设计提供了极大的灵活性。本资料包主要围绕...

    c语言的结构体c语言的结构体PDF

    C语言结构体 结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型。 一、结构说明和结构变量定义 在urboC中,结构也是一种数据类型,可以使用结构变量。因此,象其它...

    C语言结构体实现方法

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个单一的实体。这使得我们能够以更模块化和组织化的方式处理数据。本篇将详细介绍C语言中结构体的实现方法以及规范的编码...

    c语言初始结构体.zip

    c语言结构体-c语言初始结构体++代码.zip

    详解C语言Struct(结构体)系列之一

    C语言中的结构体(Struct)是一种用户定义的数据类型,允许将不同类型的数据项聚集在一起构成一个单一类型。结构体在C语言中扮演着极其重要的角色,它使得程序员可以创建复杂的自定义数据结构,以更贴近现实世界的...

    C语言 结构体范例代码

    在C语言中,结构体(struct)是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个单一的实体。这使得我们能够创建更复杂的数据结构,以更好地模拟现实世界中的对象或概念。以下是对“C语言 结构体范例...

    c语言结构体-C语言中结构体的概念与使用方法介绍

    内容概要:本文详细介绍了C语言中的结构体概念及其用法,涵盖结构体的定义、变量声明和初始化、成员访问、结构体数组以及结构体指针的相关知识点。具体示例展示结构体作为复合数据类型,能够封装多种数据类型的优点...

    C语言 循环结构体设计

    5.1 为什么需要循环控制 5.2 用while语句实现循环 5.3 用do---while语句实现循环 5.4 用for 语句实现循环 5.5 循环的嵌套 5.6 几种循环的比较 5.7 改变循环执行的状态 5.8 循环程序举例

    c语言词典结构体匹配法,qsort与bsearch

    c语言词典结构体匹配法,qsort与bsearch

    C语言:结构体与联合体详解及其应用

    最后,讨论了位字段和动态内存分配的概念及其在结构体和联合体中的应用。 适合人群:具备一定C语言基础的开发者和学生。 使用场景及目标:帮助读者深入理解C语言中结构体和联合体的内部机制和应用场景,提升在系统...

    vector DBC文件转换为C结构体

    用户只需提供DBC文件作为输入,它就能自动生成相应的C语言结构体定义文件。 5. **使用生成的结构体**:在实际的C代码中,我们可以通过解码CAN消息的数据,并将其赋值给对应的结构体成员,来实现DBC文件描述的信号的...

Global site tag (gtag.js) - Google Analytics