通过前面的举例分析,我们知道房子的类型,决定了房子的属性。例如,一房一厅的房子,有一个房间的空间;两房一厅的房子,有两个房间的空间。同理,在C语言中,提供了“数据类型”,它可以定义变量。不同数据类型定义的变量,有不同的存储空间和使用方式。
C语言支持的基本数据类型有:
(1) char类型,char类型称为“字符”类型。一个字符是 'A', 'B', 'C', '#', '!' 这样的数据。char类型的变量称为字符型变量,可以存放一个字符。char类型变量占据1个字节的存储空间。
(2) short 类型,short类型称为“短整型”。它用于存储一个整数值,例如100,188这样的整数值,short类型变量占据2个字节的存储空间。
(3) int类型,int类型称为“整型”。它用于存储一个整数值,int类型变量占据4个字节的存储空间。
(4) long类型,long类型称为“长整型”。它用于存储一个整数值,long类型变量占据4个字节的存储空间。而且 long 类型可以组合成 long long 类型,它占据8个字节的存储空间。
(5) float类型,float类型称为“单精度浮点型”。它存放一个浮点数,例如12.345, 16.888这样带小数点的小数。float类型变量占据4个字节的存储空间。
(6) double类型,double类型称为“双精度浮点数”。它存储一个浮点数,double类型变量占据8个字节的存储空间。
对于char、short、int和long类型,默认是“有符号数”类型,所以,能够表示负数。那么,它们可以结合unsigned关键字使用,表示无符号类型数据。
注意:float、double表示的浮点数类型,不可以与unsigned关键字组合使用。
我们可以归纳总结“有符号数类型”和“无符号数类型”的存储容量和表示数值范围如下表。
数据类型 | 容量(位数) | 取值范围 |
char | 8(1个字节) | -128 ~ 127 (-2^7 ~ 2^7-1) |
unsigned char | 8(1个字节) | 0 ~ 255 (0 ~ 2^8 - 1) |
short | 16(2个字节) | -32767 ~ 32768 (-2^15 ~ 2^15-1) |
unsigned short | 16(2个字节) | 0 ~ 65536 (0 ~ 2^18-1) |
int | 32(4个字节) | -2147483648 ~ 2147483647 (-2^31 ~ 2^31-1) |
unsigned int | 32(4个字节) | 0 ~ 4294967295 (0 ~ 2^32-1) |
long | 32 | -2147483648 ~ 2147483647 (-2^31 ~ 2^31-1) |
unsigned long | 32 | 0 ~ 4294967295 (0 ~ 2^32-1) |
long long | 64 | -9223372036854775808 ~ 9223372036854775807 (-2^63 ~ 2^63-1) |
unsigned long long | 64 | 0 ~ 18446744073709551615 (0 ~ 2^64-1) |
char类型的最大值是2^7-1,unsigned char类型的最大值是2^8-1,可以看到,由于char类型变量的最高位作为符号位,只有7位作为数值位,而unsigned char类型的变量,全部8位都作为数值位。所以,能够表示最大值的范围不一样。假设变量的数值位有N位,那么,能够表示的最大值是2的N次方减一,即 2^N - 1。例如数值位为1111 1111,此时,数值位有8位,那么,它的值是1*2^0 1*2^1 1*2^2 1*2^3 1*2^4 1*2^5 1*2^6 1*2^7;如果这样计算,比较繁琐,那么,我们可以思考:
1111 1111 1 = 1 0000 0000
所以,有:
1111 1111 = 1 0000 0000 – 1
= 1*2^8 - 1
通过这样的方式计算,就可以快速得到N位全1的二进制,它的值是2^N – 1。
5.1 字符类型在C语言中,定义了'A'、'B'、'C'、'#'、'?'这样的符号为字符。一个字符可以存放到一个字符变量中。字符的特点是:
(1) 必须使用单引号 ' ' 把字符包含起来;
(2) 字符可以是ASCII表中字符集的字符;
C语言提供了关键字char表示“字符类型”;可以定义字符类型的变量;例如:
程序运行的输出结果如下:
可以看到,用char关键字定义了字符类型的变量,分别定义了变量a和变量b,都是字符类型,并且给a变量存放了'X'字符,给b变量存放了'Y'字符。
最后,在printf()函数中,通过 %c 格式,输出字符类型变量中存放的字符。
注意:给字符变量赋值的字符,必须使用单引号' '把字符给包含起来。
一个字符在内存中存储的是其ASCII值,那么,我们可以把一个字符的ASCII值赋给一个字符变量,然后,再把它输出。测试的例子如下。
程序运行结果如下: