C语言中如何控制枚举类型占用空间的大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中如何控制枚举类型占用空间的大小相关的知识,希望对你有一定的参考价值。

C语言中枚举类型会根据其值的取值范围由编译器自动决定枚举变量所占的空间,如何强制指定其所占空间的大小呢?

在枚举类型后面设置对应的  :类型   即可。比如 enum cnum : char   (这里加上   :char)

#include <stdio.h>

enum cnum : char  // 加上   :char 则元素是 char 类型

    c_one, c_two, c_three
;

enum snum : short  // 加上   :short  则元素是 short 类型

    s_one, s_two, s_three
;

enum inum : int   // 加上   :int  则元素是 int 类型

    i_one, i_two, i_three
;

int main()

    printf("cnum: %d\\nsnum: %d\\ninum: %d\\n",
           sizeof(cnum), sizeof(snum), sizeof(inum));
    return 0;

参考技术A 标准C并没有明确规定枚举类型占用空间的大小,标准中只是说“枚举类型的尺寸是以能够容纳最大枚举子的值的整数的尺寸”,同时标准中也说明了:“枚举类型中的枚举子的值必须要能够用一个int类型表述”,也就是说,枚举类型的尺寸不能够超过int类型的尺寸,但是是不是必须和int类型具有相同的尺寸呢?上面的标准已经说得很清楚了,只要能够容纳最大的枚举子的
值的整数就可以了,那么就是说可以是char、short和int。”
不同的C编译器,对enum类型的大小作了不同的定义,而程序员是不能认为的修改枚举类型占用空间的。
参考技术B 枚举类型所占大小有其基础类型决定,c语言中无法更改其基础类型,默认为int,所以是一个字的大小,32为是4个字节。C++中根据其定义的基础类型,大小有所不同:public enum TimeofDay:unsigned long
  
  Morning,
  Afternoon,
  Evening
   ;

C 数据类型

在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。

C 中的类型可分为以下几种:

序号类型与描述
1 基本类型:
它们是算术类型,包括两种类型:整数类型和浮点类型。
2 枚举类型:
它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。
3 void 类型:
类型说明符 void 表明没有可用的值。
4 派生类型:
它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。

数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。在本章节接下来的部分我们将介绍基本类型,其他几种类型会在后边几个章节中进行讲解。

整数类型

下表列出了关于标准整数类型的存储大小和值范围的细节:

类型存储大小值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。

以下列出了32位系统与64位系统的存储大小的差别(windows 相同):

 

技术图片

为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小。下面的实例演示了获取 int 类型的大小:

实例

#include <stdio.h> #include <limits.h> int main() { printf("int 存储大小 : %lu n", sizeof(int)); return 0; }

%lu 为 32 位无符号整数,详细说明查看 C 库函数 - printf()。

当您在 Linux 上编译并执行上面的程序时,它会产生下列结果:

int 存储大小 : 4 

浮点类型

下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:

类型存储大小值范围精度
float 4 字节 1.2E-38 到 3.4E+38 6 位小数
double 8 字节 2.3E-308 到 1.7E+308 15 位小数
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位小数

头文件 float.h 定义了宏,在程序中可以使用这些值和其他有关实数二进制表示的细节。下面的实例将输出浮点类型占用的存储空间以及它的范围值:

实例

#include <stdio.h> #include <float.h> int main() { printf("float 存储最大字节数 : %d n", sizeof(float)); printf("float 最小值: %En", FLT_MIN ); printf("float 最大值: %En", FLT_MAX ); printf("精度值: %dn", FLT_DIG ); return 0; }

%E 为以指数形式输出单、双精度实数,详细说明查看 C 库函数 - printf()。

当您在 Linux 上编译并执行上面的程序时,它会产生下列结果:

float 存储最大字节数 : 4 
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

void 类型

void 类型指定没有可用的值。它通常用于以下三种情况下:

序号类型与描述
1 函数返回为空
C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status);
2 函数参数为空
C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void);
3 指针指向 void
类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。

如果现在您还是无法完全理解 void 类型,不用太担心,在后续的章节中我们将会详细讲解这些概念。

分类:深圳特区代孕公司微13802269370   代孕网添加微信13802269370

以上是关于C语言中如何控制枚举类型占用空间的大小的主要内容,如果未能解决你的问题,请参考以下文章

枚举占多少字节?

delphi中枚举类型和子界,数组,集合的详解以及类型说明

C语言进阶自定义类型详解(结构体+枚举+联合)

求教C语言枚举类型的问题

c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)

c语言自定义类型枚举,联合(枚举的巧妙使用,联合体大小的计算)