C - 数据类型



C 语言中的数据类型指的是一个广泛的系统,用于声明不同类型的变量函数。变量的类型决定了它在存储器中占用多少空间以及如何解释存储的位模式。在本章中,我们将学习C 语言中的数据类型。一个相关的概念是“变量”,它指的是处理器内存中可寻址的位置。通过不同的输入设备捕获的数据存储在计算机内存中。可以为存储位置分配一个符号名称,称为变量名。

C 是一种静态类型语言。在实际使用变量之前,必须显式声明变量的名称及其要存储的数据类型。

C 也是一种强类型语言,这意味着不允许自动或隐式地将一种数据类型转换为另一种数据类型。

C 语言中的类型可以分类如下:

序号 类型 & 描述
1

基本类型

它们是算术类型,进一步分为:(a) 整数类型和 (b) 浮点类型。

2

枚举类型

它们也是算术类型,用于定义只能在整个程序中分配某些离散整数值的变量。

3

void 类型

类型说明符void表示没有值可用。

4

派生类型

它们包括 (a) 指针类型,(b) 数组类型,(c) 结构体类型,(d) 联合体类型和 (e) 函数类型。

数组类型和结构体类型统称为聚合类型。函数的类型指定函数返回值的类型。我们将在下一节中看到基本类型,而其他类型将在后续章节中介绍。

C 语言中的整数数据类型

下表提供了标准整数类型的详细信息,包括其存储大小和值范围:

类型 存储大小 值范围
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 8 字节 -9223372036854775808 到 9223372036854775807
unsigned long 8 字节 0 到 18446744073709551615

要获取特定平台上某个类型或变量的确切大小,可以使用sizeof运算符。表达式sizeof(type)以字节为单位生成对象或类型的存储大小。

整数数据类型的示例

下面是一个示例,使用 limits.h 头文件中定义的不同常量来获取机器上各种类型的尺寸:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

   printf("CHAR_BIT    :   %d\n", CHAR_BIT);
   printf("CHAR_MAX    :   %d\n", CHAR_MAX);
   printf("CHAR_MIN    :   %d\n", CHAR_MIN);
   printf("INT_MAX     :   %d\n", INT_MAX);
   printf("INT_MIN     :   %d\n", INT_MIN);
   printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
   printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
   printf("SCHAR_MAX   :   %d\n", SCHAR_MAX);
   printf("SCHAR_MIN   :   %d\n", SCHAR_MIN);
   printf("SHRT_MAX    :   %d\n", SHRT_MAX);
   printf("SHRT_MIN    :   %d\n", SHRT_MIN);
   printf("UCHAR_MAX   :   %d\n", UCHAR_MAX);
   printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
   printf("ULONG_MAX   :   %lu\n", (unsigned long) ULONG_MAX);
   printf("USHRT_MAX   :   %d\n", (unsigned short) USHRT_MAX);

   return 0;
}

输出

编译并执行上述程序时,它在 Linux 上会产生以下结果:

CHAR_BIT    :   8
CHAR_MAX    :   127
CHAR_MIN    :   -128
INT_MAX     :   2147483647
INT_MIN     :   -2147483648
LONG_MAX    :   9223372036854775807
LONG_MIN    :   -9223372036854775808
SCHAR_MAX   :   127
SCHAR_MIN   :   -128
SHRT_MAX    :   32767
SHRT_MIN    :   -32768
UCHAR_MAX   :   255
UINT_MAX    :   4294967295
ULONG_MAX   :   18446744073709551615
USHRT_MAX   :   65535

C 语言中的浮点数据类型

下表提供了标准浮点类型的详细信息,包括存储大小、值范围及其精度:

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

"float.h"头文件定义了宏,允许您在程序中使用这些值以及关于实数二进制表示的其他详细信息。

浮点数据类型的示例

以下示例打印 float 类型的存储空间和范围值:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

   printf("Storage size for float : %zu \n", sizeof(float));
   printf("FLT_MAX     :   %g\n", (float) FLT_MAX);
   printf("FLT_MIN     :   %g\n", (float) FLT_MIN);
   printf("-FLT_MAX    :   %g\n", (float) -FLT_MAX);
   printf("-FLT_MIN    :   %g\n", (float) -FLT_MIN);
   printf("DBL_MAX     :   %g\n", (double) DBL_MAX);
   printf("DBL_MIN     :   %g\n", (double) DBL_MIN);
   printf("-DBL_MAX     :  %g\n", (double) -DBL_MAX);
   printf("Precision value: %d\n", FLT_DIG );

   return 0;
}

输出

编译并执行上述程序时,它在 Linux 上会产生以下结果:

Storage size for float : 4 
FLT_MAX      :   3.40282e+38
FLT_MIN      :   1.17549e-38
-FLT_MAX     :   -3.40282e+38
-FLT_MIN     :   -1.17549e-38
DBL_MAX      :   1.79769e+308
DBL_MIN      :   2.22507e-308
-DBL_MAX     :  -1.79769e+308
Precision value: 6

注意:"sizeof" 返回 "size_t"。 "size_t" 的无符号整数类型可能会因平台而异。而且,它可能并非在所有地方都是 long unsigned int。在这种情况下,我们使用 "%zu" 作为格式字符串而不是 "%d"。

早期版本的 C 语言没有布尔数据类型。ANSI C 的 C99 标准化引入了 _bool 类型,它将零值视为 false,非零值视为 true。

C 语言中的用户定义数据类型

有两种用户定义的数据类型structunion,可以使用其他基本数据类型的组合来定义。

结构体数据类型

C 语言的独特特性之一是将不同数据类型的变量存储在一个变量中。提供了structunion关键字来派生用户定义的数据类型。例如,

struct student   {   
   char name[20];   
   int marks, age;   
};

联合体数据类型

联合体是结构体的一种特殊情况,其中联合体变量的大小不是各个元素大小的总和(如结构体),而是对应于各个元素中最大的大小。因此,一次只能使用其中一个元素。请看以下示例

union ab  {  
   int a;  
   float b;  
};  

我们将在后面的章节中学习更多关于结构体和联合体类型的知识。

C 语言中的 void 数据类型

void 类型指定没有值可用。它用于三种情况:

序号 类型 & 描述
1

函数返回 void

C 语言中有各种函数不返回值,或者可以说它们返回void。不返回值的函数的返回类型为void。例如,void exit (int status);

2

函数参数为 void

C 语言中有各种函数不接受任何参数。不带参数的函数可以接受 void。例如,int rand(void);

3

指向 void 的指针

void *类型的指针表示对象的地址,但不表示其类型。例如,内存分配函数 void *malloc( size_t size );返回一个指向 void 的指针,该指针可以转换为任何数据类型。

C 语言中的数组数据类型

数组是存储在连续内存位置中的多个相同数据类型值的集合。数组的大小在方括号 [] 中指定。例如,

int marks[5];

可以在声明时初始化数组。要分配的值放在括号中。

int marks[ ]={50,56,76,67,43};

C 还支持多维数组。要了解更多关于数组的信息,请参阅关于C 语言中的数组的章节。

C 语言中的指针数据类型

指针是一种特殊的变量,它存储内存中另一个变量/对象的地址或引用。指针变量的名称以星号 (*) 为前缀。指针变量的类型和要指向的变量/对象必须相同。

int x;  
int *y;  
y = &x;

这里,"y" 是一个指针变量,它存储 "int" 类型变量 "x" 的地址。

指针用于许多不同的目的。文本字符串操作和动态内存分配是一些必须使用指针的过程。在本教程的后面,您可以找到关于C 语言中的指针的详细章节。

广告