C语言规定,定义变量的时候必须指明变量的类型。例如:
int num;
num
是变量名,int
是变量的数据类型。
数据的种类有很多,比如整数、小数、符号(a、A、#)等。数据类型的作用主要有两个:
- 指明变量存储的数据种类,比如
int
类型的变量只能存储整数; - 指明变量占用的内存空间大小,比如
int
类型变量占用的内存空间通常是 4 个字节。
C语言提供了很多种数据类型,常见的有整形、浮点型和字符型。
整形
整形专门用来定义存储整数的变量,int
是最常用的一种整形。
C语言提供了很多种整形,如表 1 所示。
整 形 | 含 义 |
---|---|
int | 最常用的整形。 |
short int | 又称“短整型”,可以简写为 short。 |
long int | 又称“长整形”,可以简写为 long。 |
long long int | 又称“超长整形”,可以简写为 long long。 |
C 语言标准没有具体规定各个整形变量占用多少内存空间,只要求 long 不能比 int 小,short 不能比 int 大。表 1 中各整形变量占用内存空间的大小关系是:
short ≤ int ≤ long ≤ long long通常情况下:
- short 型变量占用 2 个字节的内存,能存储 -32768 ~ +32767(-215 ~ +215-1)范围内的整数;
- int 类型变量占用 4 个字节的内存,能存储 -2147483648 ~ +2147483647(-231 ~ +231-1)范围内的整数;
- long 类型变量占用 4 或 8 个字节的内存,占用 4 个字节时和 int 相同;占用 8 个字节时能存储 -263 ~ +263-1 范围内的整数,这是一个非常大的区间。
- long long 型变量占用 8 个字节的内存,能存储 -263 ~ +263-1 范围内的整数,这是一个非常大的区间。
举个简单的例子:
short short_num = 10;
int int_num = 100;
long long_num = 1000;
long long long_long_num = 10000;
程序中分别定义了 4 种整形变量,并分别给它们赋了值。
浮点型
浮点型专门用来定义存储小数的变量。
C语言提供了 3 种浮点型,分别是 float(单精度浮点型)、double(双精度浮点型)和 long double(长双精度浮点型):
- float 型变量占用 4 个字节的内存空间,能精确存储 6~7 位有效数字,能表示 -3.4*10-38 ~ +3.4*1038 范围内的小数;
- double 型变量通常占用 8 个字节的内存空间,能精确存储 15~16 位有效数字,能表示 -1.7*10-308 ~ +1.7*10308 范围内的小数;
- long double 型变量占用 8 或 16 个字节的内存空间,占用 8 个字节时和 double 相同;占用 16 个字节时,能精确存储 18~19 位有效数字,能表示 -1.2*10-4932 ~ 1.2*104932 范围内的小数。
举个简单的例子:
float f_num = 1.23;
double d_num = 2.3456;
long double ld_num = 3.1415926;
字符型
字符型用来定义存储字符的变量。在 C 语言中,将用' '
括起来的字母、数字、标点符号等称为字符,例如 ‘a’、’A’、’1’、’9’、’#’、’*’ 等都是字符。
字符型用 char 表示,char 是 character(字符)的缩写,见明知意。举个简单的例子:
char c = 'A';
定义字符变量 c 并赋初值为 ‘A’。
字符型变量占用 1 个字节的内存空间。字符型变量也不是任意字符都能存储,它只能存储 ASCII 字符集中记录的 127 个字符,比如圆周率 π 没有在 ASCII 字符集中,就无法存储到字符型变量中。
使用字符型变量存储字符时,内存空间中存储的并非字符,而是字符在 ASCII 中对应的整数。例如,字符 ‘A’ 在 ASCII 中对应的十进制数是 65,它的二进制形式是 100 0001,因此字符变量 c 中存储的就是0100 0001
。
ASCII 字符集中,所有字符可以用 7 个二进制来表示,因此都可以用 char 型变量来存储。
char 型变量还可以用来存储 -128 ~ 127 范围内的整数,例如:
char a = -128;
signed和unsigned
某些场景中,变量的取值范围可能只有正值,例如用变量来存储学号、年龄、库存量等。这种情况下,可以将变量定义为“无符号”类型。
所谓无符号类型,就是在原有数据类型的前面加上unsigned
。例如unsigned int
表示无符号整形,此类型的变量只能用来存储非负整数。
和无符号类型相对地,是signed
有符号类型。例如signed int
表示有符号整形,它和 int 类型一样,可以存储负数、0 和整数。默认情况下,不加 unsigned 修饰的类型都是 signed 有符号类型,signed
可以省略不写。
signed 和 unsigned 只能用来修饰整形和字符型,不能修饰浮点型。当使用 unsigned 修饰整形和字符型时,定义的变量能存储更大范围的正值,如下表所示:
无符号类型 | 含 义 |
---|---|
unsigned int | 无符号整形,占用 4 个字节,能存储 0 ~ 4294967295(0 ~ 232-1)范围内的整数。 |
unsigned short | 无符号短整型,占用 2 个字节,能存储 0 ~ 65535(0 ~ 216-1)范围内的整数。 |
unsigned long | 无符号长整形,占用 4 个字节时和 unsigned int 一样;占用 8 个字节时,能存储 0 ~ 264-1 范围内的整数。 |
unsigned long long | 无符号超长整形,占用 8 个字节,能存储 0 ~ 264-1 范围内的整数。 |
unsigned char | 无符号字符型,占用 1 个字节,能存储 ASCII 字符集中所有的字符,也能存储 0 ~ 255 之间的整数。 |
举个简单的例子:
#include <stdio.h>
int main() {
signed int num = -10; // 等价于 int num = -10;
unsigned int u_num = 10;
signed char c = 'A'; // 等价于 char c = 'A';
unsigned char u_c = 255;
printf("num = %d\n", num); //输出 num 的值
printf("u_num = %u\n", u_num); //输出 u_num 的值
printf("c = %c\n", c); //输出 c 的值
printf("u_c = %u", u_c); //输出 u_c 的值
return 0;
}
运行结果为:
num = -10
u_num = 10
c = A
u_c = 255