数据类型决定三件事:这块内存占多大、里面的 0 和 1 怎么解释、能参与什么运算。C++ 的类型分两大类:基本类型(整型、浮点、字符、布尔——本章重点)和构造/复合类型(数组、结构体、指针、类……后面章节再讲)。写代码时选类型,本质上是在替编译器决定"用哪种算盘"——算盘选错,结果就错(5 / 2 得 2,5.0 / 2 得 2.5)。
一、类型到底决定了什么
同样 4 个字节的 0 和 1,按不同类型解释,结果天差地别:
| 同样的二进制 | 按 int 解释 |
按 float 解释 |
|---|---|---|
| 一个 4 字节的位模式 | 可能是 1084227584 |
可能是 5.0 |
所以类型不是"标签",是"解读方式"。它决定:
- 占多少内存:
char1 字节、int4 字节、double8 字节 - 值的范围:
short到 3 万,long long到 922 京 - 能做什么运算:整数能取余(
%),浮点不能;字符能按 ASCII 加减 - 运算结果是什么:
5 / 2是整数除法得 2;5.0 / 2得 2.5
二、两大类类型
① 基本类型(本章学这四种)
| 类别 | 类型 | 小节 |
|---|---|---|
| 整型 | short int long long long(各有 unsigned 版) |
2.3.3、2.4.1 |
| 浮点 | float double long double |
2.3.4、2.4.1 |
| 字符 | char(以及 signed char/unsigned char) |
2.3.5、2.4.2 |
| 布尔 | bool(true / false) |
2.4.3 |
| 空 | void(表示"没有类型/没有返回值") |
第 5 章 |
② 构造与复合类型(后面章节)
数组、字符串、结构体、联合、枚举、指针、引用、类。它们的共同点是:由基本类型"搭"出来的——比如一个 int 数组,就是"一排 int 小盒子连在一起"。
先用 int、double、char、bool 这四把"基本工具"把逻辑写顺(第 3~4 章的运算与判断),再去处理"一堆数据"(数组、字符串)、"一个复杂对象"(结构体、类)。基本类型不牢,后面全是空中楼阁。
三、类型修饰符
基本类型还能加"形容词"来微调:
| 修饰符 | 作用 | 例子 |
|---|---|---|
unsigned |
去掉负数,正数范围翻倍 | unsigned int |
signed |
明确"要有负数"(默认行为) | signed int |
short / long |
调宽窄 | short int、long long int |
const |
值不可改(2.2.5) | const int MAX = 100; |
省写规则:short int 可以写成 short,long long int 写成 long long,unsigned int 写成 unsigned——都是合法的。
四、C++ 是"静态强类型"语言
两个关键词,各有用处:
- 静态:类型在编译期就确定,写错立刻报错(写
int a = "abc";编译不过) - 强类型:不同类型之间不会"悄悄换",需要你明确转换(第 3 章的类型转换)
和 Python 的对比(如果你以后会接触):
| C++ | Python | |
|---|---|---|
| 类型什么时候定 | 写代码时(编译期) | 运行时 |
| 变量要不要声明类型 | 要 | 不用(a = 1 就行) |
| 好处 | 快、错得早 | 写得省事 |
| 代价 | 写得啰嗦 | 错得晚(跑到那行才发现) |
结论:C++ 的"啰嗦"换来的是编译期就把错误拦下来——这是它快且稳的根源。
五、动手 Demo:一张 sizeof 体检表
新建 types.cpp:
#include <iostream>
using namespace std;
int main() {
cout << "char : " << sizeof(char) << " 字节" << endl;
cout << "bool : " << sizeof(bool) << " 字节" << endl;
cout << "short : " << sizeof(short) << " 字节" << endl;
cout << "int : " << sizeof(int) << " 字节" << endl;
cout << "long : " << sizeof(long) << " 字节" << endl;
cout << "long long : " << sizeof(long long) << " 字节" << endl;
cout << "float : " << sizeof(float) << " 字节" << endl;
cout << "double : " << sizeof(double) << " 字节" << endl;
return 0;
}
看到什么算成功:跑出一张表,大致是 1 1 2 4 4 8 4 8(long 在 Windows 上是 4)。
顺手看一个"类型决定结果"的铁证:
cout << 5 / 2 << endl; // 2 ← 两个整数,做整数除法
cout << 5.0 / 2 << endl; // 2.5 ← 有一个是小数,做浮点除法
30 秒实验:把 5 / 2 改成 5 % 2(取余),输出 1;再试试 5.0 % 2——编译报错:% 只能用于整数。这就是"类型决定能做什么运算"的直接体现。
六、常见误区
- "类型只是个名字,值才是重要的"——类型决定怎么解读这块内存。同一串字节,按
int和按float读出来完全不同 - "变量能装任何数,类型无所谓"——每种类型都有范围:
short装不下 10 万,int装不下手机号(2.3.3 的溢出) - "类型错了编译器会兜着"——有时会(隐式转换),但转换过程可能丢精度(
double转int小数被切掉)。编译器不报错 ≠ 结果正确 - "
void也是一种数据"——void表示"没有":没有返回值、没有参数、没有具体类型。它是"空",不是"一种东西"
自测四问(点开对答案)
1. 数据类型决定了哪三件事?——**占多少内存**、**二进制怎么解释**、**能参与什么运算**(以及结果类型)。 2. C++ 的类型分哪两大类?——**基本类型**(整型/浮点/字符/布尔/空)与**构造复合类型**(数组/结构体/指针/类等)。 3. `5 / 2` 和 `5.0 / 2` 分别得多少?为什么?——`2` 和 `2.5`;前者是**整数除法**(小数被丢掉),后者含浮点数,做浮点除法。 4. "静态强类型"是什么意思?——类型在**编译期**确定(静态),不同类型间**不自动混淆**、需要显式转换(强)。- ☑ 数值类型