数据类型
概念说明
数据类型决定了变量占用多少内存、能表示什么范围,以及编译器应该怎样解释那一段二进制数据。
同样的 4 个字节,如果按 int 看是整数,按 float 看则可能表示浮点数,类型不同,解释方式也完全不同。
C 的基础类型可以先按下面几组理解:
- 整型:
char、short、int、long、long long - 浮点型:
float、double、long double - 布尔型:
_Bool,常配合<stdbool.h>中的bool - 特殊类型:
void
学类型时最重要的一点是区分“语言保证”和“平台常见现象”。
例如 char 一定是 1 字节,但 int、long、long double 的大小会因平台和编译器而不同。
语法/规则
- 整型可以搭配
signed或unsigned修饰,表示有符号或无符号整数。 char既可以表示字符,也是一种很小的整型,常用来存储单个字节。float、double、long double用来表示小数,精度和范围通常逐步增加。void表示“没有具体值”,常见于无返回值函数、无参数函数和通用指针void *。_Bool是 C99 引入的布尔类型;如果想写成bool,通常需要包含<stdbool.h>。sizeof(type)或sizeof value可以查看类型或对象占用的字节数,结果类型通常是size_t。- 输出不同类型时,要尽量使用匹配的格式控制符,例如
%d、%u、%lld、%f、%c、%zu。
示例
| |
输出结果:
| |
sizeof(int) 和 sizeof(double) 的结果在常见平台上经常分别是 4 和 8,但学习时仍然要记住:
某些类型大小并不是所有平台都完全固定。
常见错误
- 把不同平台上的类型大小当成绝对常识,例如默认认为
long一定是 8 字节。 - 用错误的格式控制符输出数据,例如用
%d输出double或用%f输出整数。 - 不区分
signed和unsigned,在比较和运算时得到意外结果。 - 把
char只当字符看,忽略它本质上也是一个小整数类型。 - 看到
sizeof的结果就直接硬编码进程序,而不是让代码根据类型自动计算字节数。