C 枚举,位域

枚举的介绍和使用

枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。
枚举语法定义格式为:

enum 枚举名 {枚举元素1,枚举元素2,……};

注意:各枚举元素之间用逗号分隔,最后一个枚举元素后不加“ ; ”号。

//枚举
enum Num//枚举名
{
	one, two, three, four, five//枚举元素
};
枚举变量的定义

前面我们只是声明了枚举类型,接下来我们看看如何定义枚举变量。

我们可以通过以下三种方式来定义枚举变量

1、先定义枚举类型,再定义枚举变量
enum Num//枚举名
{
	one, two, three, four, five//枚举元素
};
enum Num num;

2、定义枚举类型的同时定义枚举变量
enum Num//枚举名
{
	one, two, three, four, five//枚举元素
}num;//枚举变量

3、省略枚举名称,直接定义枚举变量
enum 
{
	one, two, three, four, five//枚举元素
}num;//枚举变量

在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,且如果修改枚举元素的值第一个元素的值会默认为0;如下:

enum Num
{
	one, two, three, four, five
}num;
int main()
{
	num = one; printf("%d\n", num);
	num = two; printf("%d\n", num);
	num = three; printf("%d\n", num);
	num = four; printf("%d\n", num);
	num = five; printf("%d\n", num);
	return 0;
}

输出
在这里插入图片描述
当修改前一个枚举元素初值时,后一个枚举元素值为前一个枚举元素值加1;如下:
代码省略

枚举的使用

个人认为枚举最实用的就是swich条件循环。很清晰的表达:

#include <stdio.h>
#include <stdlib.h>
int main()
{
 
    enum color { red=1, green, blue };
 
    enum  color favorite_color;
 
    /* ask user to choose color */
    printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
    scanf("%d", &favorite_color);
 
    /* 输出结果 */
    switch (favorite_color)
    {
    case red:
        printf("你喜欢的颜色是红色");
        break;
    case green:
        printf("你喜欢的颜色是绿色");
        break;
    case blue:
        printf("你喜欢的颜色是蓝色");
        break;
    default:
        printf("你没有选择你喜欢的颜色");
    }
    return 0;
}

位域的介绍和使用

位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

简而言之:
带有预定义宽度的变量被称为位域。位域可以存储多于 1 位的数。

使用位域的好处

1.有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。这样节省存储空间,而且处理简便。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
2.可以很方便的利用位域把一个变量给按位分解。比如只需要4个大小在0到3的随即数,就可以只rand()一次,然后每个位域取2个二进制位即可,省时省空间。

例如,需要一个变量来存储从 0 到 7 的值,您可以定义一个宽度为 3 位的位域,如下:

struct
{
  unsigned int age : 3;
} Age;
位域的声明和定义

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

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

位域的声明定义和枚举一样

1.先定义位域后定义变量
struct Age
{
	unsigned int age : 3;
};
struct Age Age;
2.声明同时定义
struct Age
{
	unsigned int age : 3;
}Age;
3.忽略位域定义,直接定义变量
struct
{
  unsigned int age : 3;
} Age;

#include <stdio.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; // 二进制表示为 1000 有四位,超出
   printf( "Age.age : %d\n", Age.age );
 
   return 0;
}

当上面的代码被编译时,它会带有警告,当上面的代码被执行时,它会产生下列结果
在这里插入图片描述

位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位,还是利用,这是不确定的。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值