C - 数据类型
C 语言中的数据类型是指用于声明不同类型的变量或函数的一套广泛的系统。变量的类型决定了它在存储空间中的占用空间以及如何解释存储的位模式。在本章中,我们将学习C 语言中的数据类型。一个相关的概念是"变量",它指的是处理器内存中的可寻址位置。通过不同输入设备获取的数据存储在计算机内存中。可以为存储位置分配一个符号名称,称为变量名。
C 是一种静态类型语言。在实际使用变量之前,必须明确声明变量的名称及其要存储的数据类型。
C 语言也是一种强类型语言,这意味着不允许自动或隐式地将一种数据类型转换为另一种数据类型。
C 语言中的类型可以分为以下几类:
序号 | 类型 &说明 |
---|---|
1 | 基本类型 它们是算术类型,进一步分为:(a) 整数类型和 (b) 浮点类型。 |
2 | 枚举类型 它们同样是算术类型,用于定义在整个程序中只能赋值特定离散整数值的变量。 |
3 | void 类型 类型说明符 void 表示没有值可用。 |
4 | 派生类型 包括 (a) 指针类型,(b) 数组类型,(c) 结构体类型,(d) 联合类型和 (e) 函数类型。 |
数组类型和结构体类型统称为聚合类型。函数的类型指定了函数返回值的类型。我们将在下一节中介绍基本类型,其他类型将在接下来的章节中介绍。
C 语言中的整数数据类型
下表列出了标准整数类型及其存储大小和取值范围的详细信息 -
类型 | 存储大小 | 取值范围 |
---|---|---|
字符型 | 1 字节 | -128 至 127 或 0 至 255 |
无符号字符型 | 1 字节 | 0 至 255 |
有符号字符型 | 1 字节 | -128 至 127 |
整数 | 2 或 4 个字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
无符号整数 | 2 或 4 个字节 | 0 到 65,535 或 0 到 4,294,967,295 |
短整型 | 2 个字节 | -32,768 到 32,767 |
无符号短整型 | 2字节 | 0 到 65,535 |
长整型 | 8 字节 | -9223372036854775808 到 9223372036854775807 |
无符号长整型 | 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 ", CHAR_BIT); printf("CHAR_MAX : %d ", CHAR_MAX); printf("CHAR_MIN : %d ", CHAR_MIN); printf("INT_MAX : %d ", INT_MAX); printf("INT_MIN : %d ", INT_MIN); printf("LONG_MAX : %ld ", (long) LONG_MAX); printf("LONG_MIN : %ld ", (long) LONG_MIN); printf("SCHAR_MAX : %d ", SCHAR_MAX); printf("SCHAR_MIN : %d ", SCHAR_MIN); printf("SHRT_MAX : %d ", SHRT_MAX); printf("SHRT_MIN : %d ", SHRT_MIN); printf("UCHAR_MAX : %d ", UCHAR_MAX); printf("UINT_MAX : %u ", (unsigned int) UINT_MAX); printf("ULONG_MAX : %lu ", (unsigned long) ULONG_MAX); printf("USHRT_MAX : %d ", (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 语言中的浮点数据类型
下表提供了标准浮点类型的详细信息,包括存储大小、值范围及其精度 -
类型 | 存储大小 | 取值范围 | 精度 |
---|---|---|---|
浮点型 | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位小数 |
双精度型 | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位小数 |
长整型双精度型 | 10 字节 | 3.4E-4932 到 1.1E+4932 | 19 位小数 |
头文件"float.h"定义了一些宏,允许您在程序中使用这些值以及有关实数二进制表示的其他详细信息。
浮点数据类型示例
以下示例打印浮点类型占用的存储空间及其范围值 -
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> int main(int argc, char** argv) { printf("Storage size for float : %zu ", sizeof(float)); printf("FLT_MAX : %g ", (float) FLT_MAX); printf("FLT_MIN : %g ", (float) FLT_MIN); printf("-FLT_MAX : %g ", (float) -FLT_MAX); printf("-FLT_MIN : %g ", (float) -FLT_MIN); printf("DBL_MAX : %g ", (double) DBL_MAX); printf("DBL_MIN : %g ", (double) DBL_MIN); printf("-DBL_MAX : %g ", (double) -DBL_MAX); printf("Precision value: %d ", 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"的无符号整数类型可能因平台而异。并且,它可能并非在所有情况下都是长整型无符号整数。在这种情况下,我们使用"%zu"作为格式字符串,而不是"%d"。
早期版本的 C 语言没有布尔数据类型。 ANSI C 的 C99 标准化引入了 _bool 类型,该类型将零值视为假,将非零值视为真。
C 语言中的用户定义数据类型
有两种用户定义数据类型:struct 和 union,用户可以结合其他基本数据类型来定义它们。
结构体数据类型
C 语言独有的特性之一就是将不同类型的值存储在一个变量中。关键字 struct 和 union 用于派生用户定义数据类型。例如,
struct student { char name[20]; int marks, age; };
联合数据类型
联合是结构体的一种特殊情况,联合变量的大小不像结构体那样是各个元素大小的总和,而是对应于各个元素中最大的一个。因此,一次只能使用一个元素。请看以下示例:
union ab { int a; float b; };
我们将在后面的章节中了解更多关于结构体和联合类型的知识。
C 语言中的 void 数据类型
void 类型指定没有可用的值。它在三种情况下使用 -
Sr.No | 类型 &说明 |
---|---|
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 语言中的指针 的详细章节。