C 位域

摘要:
例如,上面的结构可以重写成:struct{unsignedintwidthValidated:1;unsignedintheightValidated:1;}status;现在,上面的结构中,status变量将占用4个字节的内存空间,但是只有2位被用来存储值。让我们看看下面的实例来理解这个概念:#include#include/*定义简单的结构*/struct{unsignedintwidthValidated;unsignedintheightValidated;}status1;/*定义位域结构*/struct{unsignedintwidthValidated:1;unsignedintheightValidated:1;}status2;intmain(){printf;printf;return0;}当上面的代码被编译和执行时,它会产生下列结果:Memorysizeoccupiedbystatus1:8Memorysizeoccupiedbystatus2:4位域声明在结构内声明位域的形式如下:struct{type[member_name]:width;};下面是有关位域中变量元素的描述:元素描述type整数类型,决定了如何解释位域的值。width位域中位的数量。带有预定义宽度的变量被称为位域。
C位域

如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下:

struct
{
  unsigned intwidthValidated;
  unsigned intheightValidated;
} status;

这种结构需要 8 字节的内存空间,但在实际上,在每个变量中,我们只存储 0 或 1。在这种情况下,C 语言提供了一种更好的利用内存空间的方式。如果您在结构内使用这样的变量,您可以定义变量的宽度来告诉编译器,您将只使用这些字节。例如,上面的结构可以重写成:

struct
{
  unsigned int widthValidated : 1;
  unsigned int heightValidated : 1;
} status;

现在,上面的结构中,status 变量将占用 4 个字节的内存空间,但是只有 2 位被用来存储值。如果您用了 32 个变量,每一个变量宽度为 1 位,那么 status 结构将使用 4 个字节,但只要您再多用一个变量,如果使用了 33 个变量,那么它将分配内存的下一段来存储第 33 个变量,这个时候就开始使用 8 个字节。让我们看看下面的实例来理解这个概念:

#include <stdio.h>
#include <string.h>
/*定义简单的结构 */
struct
{
  unsigned intwidthValidated;
  unsigned intheightValidated;
} status1;
/*定义位域结构 */
struct
{
  unsigned int widthValidated : 1;
  unsigned int heightValidated : 1;
} status2;
intmain( )
{
   printf( "Memory size occupied by status1 : %d
", sizeof(status1));
   printf( "Memory size occupied by status2 : %d
", sizeof(status2));
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

位域声明

在结构内声明位域的形式如下:

struct
{
  type [member_name] : width ;
};

下面是有关位域中变量元素的描述:

元素描述
type整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。
member_name位域的名称。
width位域中位的数量。宽度必须小于或等于指定类型的位宽度。

带有预定义宽度的变量被称为位域。位域可以存储多于 1 位的数,例如,需要一个变量来存储从 0 到 7 的值,您可以定义一个宽度为 3 位的位域,如下:

struct
{
  unsigned int age : 3;
} Age;

上面的结构定义指示 C 编译器,age 变量将只使用 3 位来存储这个值,如果您试图使用超过 3 位,则无法完成。让我们来看下面的实例:

#include <stdio.h>
#include <string.h>
struct
{
  unsigned int age : 3;
} Age;
intmain( )
{
   Age.age = 4;
   printf( "Sizeof( Age ) : %d
", sizeof(Age) );
   printf( "Age.age : %d
", Age.age );
   Age.age = 7;
   printf( "Age.age : %d
", Age.age );
   Age.age = 8;
   printf( "Age.age : %d
", Age.age );
   return 0;
}

当上面的代码被编译时,它会带有警告,当上面的代码被执行时,它会产生下列结果:

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0

免责声明:文章转载自《C 位域》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ImportError:No module named google.protobuf.internalmac快捷切换jdk版本下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

gdb查看内存(转)

可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语 法如下所示:x/<n/f/u> <addr>n、f、u是可选的参数。 n是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个 内存单元的内容,一个内存单元的大小由后面的u定义。 f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式...

perl学习一:探索Perl世界

1.perl4种变量 scalar: $ 纯变量,标量array: @hash: %file: 大写 2.变量组成 1.命名规则 大小写敏感 、 字母数字下划线。。。2.无关键字,$+其他,但不可以与内置变量冲突。3.命名长度无限。 3.纯变量中:整型、浮点型、字符、字符串、 整数变量 1.可以用_分割字符数字 2.012为八进制10 3.0x1f为16进...

转载 Android快捷键 转载

一、实用类快捷键 1 常用熟悉的快捷键 CTRL+C(复制)、CTRL+X(剪切)、CTRL+Z(撤销)、CTRL+F(查找)、CTRL+H(搜索文件或字符串)、CTRL+Y(重做)、CTRL+/(双斜杠注释)、ALT+/(提示)、CTRL+SHIFT+F(格式化代码) 2 编码辅助类 1)CTRL+D 删除当前行。 2)CTRL+ALT+Down(Up...

TensorFlow 编程基础

1、TensorFlow   安装:https://www.cnblogs.com/pam-sh/p/12239387.html      https://www.cnblogs.com/pam-sh/p/12241942.html • 是一个开放源代码软件库,用于进行高性能数值计算• 借助其灵活的架构,用户可以轻松地将计算工作部署到多种平台(CPU、G...

大数据之Shell编程(一) Shell变量

1.Shell中的变量 Shell中的变量分为系统变量和用户变量,可以通过set命令查看有哪些变量可以使用系统变量比如:$HOME$PWD$SHELL$USER等等 2.变量的定义 变量=值 (例如STR=abc) 注意:=两边不能含有空格 变量一般使用大写,当然不是硬性规定 双引号和单引号区别:双引号仅仅将空格等脱意,而单引号会将所有的特殊字符脱意 &g...

关于python中带下划线的变量和函数 的意义

总结: 变量: 1. 前带_的变量: 标明是一个私有变量, 只用于标明,外部类还是可以访问到这个变量 2. 前带两个_ ,后带两个_ 的变量: 标明是内置变量, 3. 大写加下划线的变量: 标明是不会发生改变的全局变量 函数: 1. 前带_的变量: 标明是一个私有函数, 只用于标明, 2.前带两个_ ,后带两个_ 的函数: 标明是特殊函数 Pyth...