💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 3. 数据类型 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。 C 中的类型可分为以下几种: | 类型 | 说明 | | --- | --- | | 基本类型 | 它们是算术类型,包括两种类型:整数类型和浮点类型。 | |枚举类型 | 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值得变量。 | |void 类型 | 类型说明符 void 表名没有可用的值 | |派生类型| 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。 | 数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。 **整数类型** 下表列出了关于标准整数类型的存储大小和值范围的细节 |类型 | 32 位机/单位:字节 | 64 位机/单位:字节 | 值范围 | | --- | --- | --- | --- | | char | 1 | 1 | -128 到 127 或 0 到 255 | |unsigned char | 1| 1| 0 到 255 |int| 4| 4| -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |unsigned int| 4| 4| 0 到 65,535 或 0 到 4,294,967,295 |short| 2| 2| -32,768 到 32,767 | |unsigned short |2| 2| 0 到 65,535| |long | 4 | 8| -2,147,483,648 到 2,147,483,647| |unsigned long| 4| 8| 0 到 4,294,967,295 | >[info] 注意: 各种类型的存储大小与系统位数有关,但目前通用的以 64 为系统为主。 以下列出了32位系统与64位系统的存储大小的差别(windows 相同): ![](https://www.runoob.com/wp-content/uploads/2014/09/32-64.jpg) **浮点类型** | 类型 | 比特(位)数 | 有效数字 | 取值范围 | | --- | --- | --- | --- | |float | 4 | 6~7 | 1.2E-38 到 3.4E+38 | |double |8 |15~16 |2.3E-308 到 1.7E+308 | |long double |16 | 18~19| 3.4E-4932 到 1.1E+4932 | 他们的字节,精度,取值范围都可以通过代码打印实现,如下: ``` #include <stdio.h> //#include <limits.h> #include <float.h> #include <stdlib.h> void main() { /** * 整数类型 */ printf("整数类型 \n"); //char 1 字节 printf("char 存储大小: %lu \n", sizeof(char)); printf("unsinged char 存储大小: %lu \n", sizeof(unsigned char)); //short 2 字节 printf("short 存储大小: %lu \n", sizeof(short)); printf("unsinged short 存储大小: %lu \n", sizeof(unsigned short)); //int 4 字节 printf("int 存储大小: %lu \n", sizeof(int)); printf("unsinged int 存储大小: %lu \n", sizeof(unsigned int)); //long 4/8 字节 printf("long 存储大小: %lu \n", sizeof(long)); printf("unsinged long 存储大小: %lu \n", sizeof(unsigned long)); /** * 浮点类型 */ printf("\n 浮点类型 \n"); //float 4 字节 ,精度 6 位小数 printf("float 存储最大字节数:%lu \n", sizeof(float)); printf("float 最小值:%e \n", FLT_MIN); printf("float 最大值:%e \n", FLT_MAX); printf("float 精度值:%d \n", FLT_DIG); //double 8 字节 printf("double 存储最大字节数:%d \n", sizeof(double)); printf("double 最小值:%e \n", DBL_MIN); printf("double 最大值:%e \n", DBL_MAX); printf("double 精度值:%d \n", DBL_DIG); //long double 16 字节 printf("long double 存储最大字节数:%lu byte \n", sizeof(long double)); printf("long double 最小值:%lg \n", LDBL_MIN); printf("long double 最大值:%lg \n", LDBL_MAX); printf("long double 精度值:%d \n", LDBL_DIG); } ``` 输出结果 ``` 整数类型 char 存储大小: 1 unsinged char 存储大小: 1 short 存储大小: 2 unsinged short 存储大小: 2 int 存储大小: 4 unsinged int 存储大小: 4 long 存储大小: 4 unsinged long 存储大小: 4 浮点类型 float 存储最大字节数:4 float 最小值:1.175494e-38 float 最大值:3.402823e+38 float 精度值:6 double 存储最大字节数:8 double 最小值:2.225074e-308 double 最大值:1.797693e+308 double 精度值:15 long double 存储最大字节数:8 byte long double 最小值:2.22507e-308 long double 最大值:1.79769e+308 long double 精度值:15 请按任意键继续. . . ``` 可以通过 sizeof 关键字来获取数据类型占用内存的大小。 上面代码可以看到了打印中出现了很多不识的 scanf() 格式控制符,我总结了一个表,可以参考下: | 格式控制符 | 说明 | | --- | --- | | %c | 读取一个单一的字符 | |%hd、%d、%ld | 读取一个十进制整数,并分别赋值给 short、int、long 类型 |%ho、%o、%lo | 读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型 |%hx、%x、%lx | 读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型 |%hu、%u、%lu| 读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型 |%f、%lf |读取一个十进制形式的小数,并分别赋值给 float、double 类型 |%e、%le | 读取一个指数形式的小数,并分别赋值给 float、double 类型 |%g、%lg| 既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型 |%s | 读取一个字符串(以空白符为结束)