位域

在某种特定情况下,一个结构体中的多个变量只使用各自存储空间的几位,而其他位从来不使用。这种情况下,可以使用位域来限定每个变量的用来存储数据的位宽。
  • 作用

    • 限定结构体中变量用来存放数据的位宽,即使用多少位来存储变量
  • 注意

    • 使用位域的结构体所占的内存空间为结构体中占用内存空间最多的结构体变量所占用的内存空间大小,如:有long和int,最终结构所占的内存空间为long类型所占用的内存空间(8字节)

      #include <stdio.h>
      struct {
      unsigned int intVariable1 : 1;
      unsigned int intVariable2 : 1;
      } intStruct;
      struct {
      unsigned long longVariable : 1;
      unsigned int intVariable : 1;
      } longStruct;
      int main(int argc, const char * argv[]) {
      printf("%zd\n", sizeof(intStruct)); // 结果为:4
      printf("%zd\n", sizeof(longStruct)); // 结果为:8
      return 0;
      }
    • 使用位域限制的结构体变量,不可以存储超过限定位宽所能表示的最大范围的变量,否则多余的高位将截断

      // 使用上述的结构体
      int main(int argc, const char * argv[]) {
      intStruct.intVariable1 = 0;
      printf("%d\n", intStruct.intVariable1);
      intStruct.intVariable1 = 1;
      printf("%d\n", intStruct.intVariable1);
      // 下一行会发出警告:Implicit truncation from 'int' to bitfield changes value from 2 to 0
      intStruct.intVariable1 = 3;
      printf("%d\n", intStruct.intVariable1);
      return 0;
      }

共用体

共用体是一种数据类型,实现在相同的位置存储不同的数据类型,但是在某一时刻只能保存一种数据。
  • 定义方式

    union [union tag]
    {
    member definition;
    member definition;
    ...
    member definition;
    } [one or more union variables];
  • 注意

    • 共用体所占的内存空间大小为共用体中占用内存空间最多的共用体变量所占的内存空间大小。
    • 公用通常应用于几个互斥的变量上

C语言-10-位域与共用体的更多相关文章

  1. C语言高级-结构,共用体,文件,链表

    C语言结构 标准声明方式 struct student{        int age;        char sex;    }; 这个可以在main函数中定义:  struct student ...

  2. C语言共用体union

    union共用体说明: 当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍. 比如union中有{int x; double x1; char name[10] ...

  3. [C#.NET 拾遗补漏]14:使用结构体实现共用体

    在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的相关数据.在 C 语言中还有一种和结构体非常类似的语法,叫共用体(Union),有时也被直译为 ...

  4. C学习笔记(6)--- 共用体,位域深入

    1.共用体(Union): 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置 ...

  5. C/C++编程笔记:C语言对齐问题【结构体、栈内存以及位域对齐】

    引言 考虑下面的结构体定义: 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4. 现在,我们编写一个简单的程序: 运行后输出: 为什么会这 ...

  6. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  7. 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型

    函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...

  8. c的详细学习(10)结构体与共用体的学习(二)

    在c语言中,结构体数据类型与共用体数据类型都属于构造类型.共用体与结构体数据类型在定义上十分相似,但它们在存储空间的占用分配上有本质的区别.结构体变量是各种类型数据的集合,各成员占据不同的存储空间,而 ...

  9. 07.C语言:结构体、共用体、枚举

    一.结构体 是一种复合的数据类型,由多个不同类型的数据(为结构体的成员)组成的集合. 在c语言中没有给出结构体这种类型具体的形式(名称),但是给出类定义该结构体类型的方法(格式). 在使用结构体类型时 ...

随机推荐

  1. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...

  2. Java -- 根据当前日期获取当前一周的所有日期

    Learn From:http://my.oschina.net/hermer/blog/151274 /** * 测试 * @param args */ public static void mai ...

  3. 使用C语言描述静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...

  4. Java泛型数组

    文章来自http://blog.csdn.net/orzlzro/article/details/7017435 Java 不支持泛型数组.也就是说, List<String>[] ls ...

  5. Direct2D开发:从资源加载位图

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D使用Windows图像处理组件 (WIC) 来加载位图.从文件加载位图的方法很简单,而且网上的教 ...

  6. 前端翻译:Activating Browser Modes with Doctype

    一.前言 原本备份: http://www.cnblogs.com/fsjohnhuang/p/3830623.html 由于本人英语能力有限,译本内容难免有误,望各位指正! 本译文不含附录部分,请知 ...

  7. imfong.com,我的新博客地址

    imfong.com新博客采用jekyll+Github搭建,欢迎访问.

  8. jQuery中的事件冒泡

    1.什么是冒泡 eg: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <he ...

  9. 安全协议:SSL、TSL、SSH概述

    SSL(Secure Socket Layer--安全套接字层):为网络通信安全以及数据完整性提供保障的一种安全协议,在TCP/IP的传输层对网络连接进行加密: TSL(Transport Layer ...

  10. eclipse优化与标准化记录

    1.文件使用UTF-8格式: 2.取消js验证: 3.设置java文件模板