亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C - 位域

假设您的 C 程序包含许多 TRUE/FALSE 变量,这些变量分组在一个名为 status 的结构中,如下 -

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

这个结构需要 8 个字节的内存空间,但实际上,我们将在每个变量中存储 0 或 1。在这种情况下,C 编程语言提供了一种更好地利用内存空间的方法。

如果您在结构中使用此类变量,那么您可以定义一个变量的宽度,它告诉 C 编译器您将只使用这些字节数。例如,上面的结构可以改写如下 -

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

上面的结构体需要 4 字节的内存空间用于状态变量,但只有 2 位用于存储值。

如果您将使用最多 32 个变量,每个变量的宽度为 1 位,那么状态结构也将使用 4 个字节。但是,一旦您有 33 个变量,它将分配内存的下一个插槽,并将开始使用 8 个字节。让我们检查下面的例子来理解这个概念 -

现场演示
#include <stdio.h>
#include <string.h>

/* define simple structure */
struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status1;

/* define a structure with bit fields */
struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status2;
 
int main( ) {
   printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
   printf( "Memory size occupied by status2 : %d\n", sizeof(status2));
   return 0;
}

当上面的代码编译并执行时,它会产生以下结果 -

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

位字段声明

位域的声明在结构中具有以下形式 -

struct {
   type [member_name] : width ;
};

下表描述了一个位域的变量元素 -

Sr.No. 元素和描述
1

类型

确定如何解释位域值的整数类型。类型可以是 int、signed int 或 unsigned int。

2

成员名称

位域的名称。

3

宽度

位域中的位数。宽度必须小于或等于指定类型的位宽。

以预定义宽度定义的变量称为位域 .一个位域可以容纳多个位;例如,如果您需要一个变量来存储从 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;

int main( ) {

   Age.age = 4;
   printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
   printf( "Age.age : %d\n", Age.age );

   Age.age = 7;
   printf( "Age.age : %d\n", Age.age );

   Age.age = 8;
   printf( "Age.age : %d\n", Age.age );

   return 0;
}

当上面的代码被编译时,它会编译并发出警告,当执行时,它会产生以下结果 -

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

C语言

  1. C# 位和位移运算符
  2. C 编程中用户定义函数的类型
  3. 将数组传递给 C 中的函数
  4. C 结构体和指针
  5. Java this 关键字
  6. Java 封装
  7. C++ 结构与示例
  8. C - 函数
  9. C - 变量参数
  10. MATLAB - 集成
  11. C# - 方法
  12. C# - 代表