Skip to content

第 4 章 程序的六种"容器"


🏗️ 前情回顾:上一章用 int 存整数,但圆周率、名字、对错——int 搞不定。这章打开 C++ 的类型工具箱。六种类型,按用途分成三组,一次讲清楚。

🎯 本章目标

学完这一章,你能:

  • 说出 C++ 中最常用的六种数据类型
  • 知道每种类型能存什么、占多大空间
  • 理解"溢出"是什么以及如何避免
  • 区分 char(单字符)、string(字符串)和数字类型
  • 知道 true 和 false 是什么
  • 根据场景选择正确的类型

📖 故事引入

小刚写了一个程序,算全校有多少学生。他把人数存在一个变量里,数字是 1280——完全正常。

然后他又写了一个程序,算他玩的游戏里一共打了多少分。分数是 8500000000(85 亿)。

程序运行……显示的结果是 5237120。完全不对。

小刚懵了。"我没写错啊?"

他没写错算法。他选错了"数字的容器"——有些容器只能装小数字,硬塞大数字进去就会溢出,像一个小杯子接一整桶水,多的全洒了。

今天我们就来搞清楚:C++ 里有哪些"容器",分别用来装什么。而这一切的起点,就是你第 3 章已经掌握的 int——现在让我们看看它的五个"兄弟姐妹"。


🧱 知识讲解

4.1 数据类型是什么

计算机的内存不是无限大的。当你写下数据,计算机需要在内存里给它分配空间。数据类型就是告诉计算机:"请给我准备多大的空间、用来存什么"

就像你去超市买饮料,你得告诉店员:"我要小杯 / 中杯 / 大杯"。不同的杯能装不同量的饮料。数据类型就是杯子的尺寸。

C++ 有六种最常用的类型,按"装的东西"分成三组:

分组类型用来装什么
数字int / long long / double整数 / 大整数 / 小数
文字char / string单个字符 / 一串文字
判断bool真或假

下面一个一个来。


4.2 整数:intlong long

类型占用空间能表示的范围适合场景
int4 字节约 -21 亿 ~ 21 亿最常用,主力
long long8 字节约 ±9×10¹⁸数字超过 21 亿时用

记住:int 能装到约 21 亿。超过这个数,立刻换 long long

cpp
int age = 12;                     // 年龄,int 绰绰有余
long long stars = 100000000000LL; // 1000 亿颗星星,必须用 long long

4.3 什么是溢出

如果给 int 存一个超过 21 亿的数——

cpp
// ❌ 错误:30 亿超过 int 上限,会溢出!
int a = 3000000000;  // 30 亿
cout << a;            // 输出:-1294967296(一个奇怪的数字)

// ✅ 正确:用 long long
long long a = 3000000000LL;
cout << a;            // 输出:3000000000

这叫做溢出——数字太大,容器装不下,多出来的部分"溢"成了乱七八糟的数字。

⚠️ 溢出不会报错!程序会开开心心地给你一个错误结果。这是溢出的可怕之处——你完全不知道算错了。

4.4 浮点数:double

整数用 int,那 3.14 怎么办?用 double(双精度浮点数):

类型占用空间精度适合场景
double8 字节约 15 位有效数字所有需要小数的计算
cpp
double pi = 3.14159265358979;
double score = 95.5;
double price = 12.8;

竞赛中需要小数时,一律用 double

4.5 字符:char

有时候你只需要存一个字母或符号——比如考试成绩的等级(A/B/C/D),或者一个标点符号。这时候 int 不合适,string 又太大了。

char 是专门存单个字符的类型,用单引号括起来:

cpp
char grade = 'A';       // 成绩等级
char firstLetter = 'Z'; // 首字母
char symbol = '?';      // 标点符号

char 占 1 个字节。它本质上存的是一个整数(字符的 ASCII 码),所以 'A' 在计算机内部其实是数字 65。但现阶段你把它当"装单个字符的容器"用就行。

💡 单引号 'A' 是 char,双引号 "A" 是 string。一个字符的区别,却完全是两种类型。

4.6 字符串:string

如果你想存一个名字、一句话、一整段文字——用 string。它用双引号

cpp
string name = "小明";
string greeting = "Hello, World!";
string school = "阳光小学";

string 和之前学的类型有一个重要区别:它不是 C++ 的"原生"类型,而是标准库提供的工具。使用时需要在文件开头 #include <string>

cpp
#include <iostream>
#include <string>       // ← 用 string 必须加这行
using namespace std;

int main() {
    string name = "小明";
    cout << "你好," << name << "!" << endl;
    return 0;
}

现阶段知道怎么声明 string、怎么输出就够了。string 还有很多操作(拼接、长度、查找),后面专门有章节讲。

4.7 布尔值:bool

生活中很多问题的答案只有两种——是或不是、对或错、真或假。编程里也一样。

bool 类型只能存两个值:true(真)或 false(假)。

cpp
bool isPassed = true;     // 及格了
bool isRaining = false;   // 没下雨
bool hasKey = true;       // 有钥匙

bool 占 1 个字节。它看起来简单,但以后你会频繁用到它——每个 if 判断、每个循环条件,背后都是 bool 在起作用。

4.8 sizeof:看看类型有多大

你可以用 sizeof 关键字来查一个类型占几个字节:

cpp
cout << "int: " << sizeof(int) << " 字节" << endl;             // 4
cout << "long long: " << sizeof(long long) << " 字节" << endl; // 8
cout << "double: " << sizeof(double) << " 字节" << endl;       // 8
cout << "char: " << sizeof(char) << " 字节" << endl;           // 1
cout << "bool: " << sizeof(bool) << " 字节" << endl;           // 1

4.9 类型选择速查表

场景用什么示例
计数、人数、年龄intint count = 42;
可能很大的数(乘积、大数据)long longlong long total = 0;
带小数(面积、平均分、价格)doubledouble avg = 91.5;
单个字符(等级、符号)charchar grade = 'A';
名字、一句话、文字stringstring name = "小明";
是非判断(对错、真假)boolbool ok = true;

✋ 动手试试

试试 1:运行 sizeof 代码(4.8 节),看看你的电脑上每种类型占几字节。跟你同桌的一样吗?

试试 2:把 int a = 2147483647;(int 的最大值)加 1,输出结果。你发现了什么?

试试 3:用 double 算 10 ÷ 3。输出结果。如果用 int 算呢?

试试 4:分别声明 char、string、bool 变量,赋上值,用 cout 输出它们。

cpp
char c = 'X';
string s = "测试";
bool b = true;
cout << c << " " << s << " " << b << endl;  // 输出什么?

bool 输出 true 会显示 1,false 会显示 0。这是 C++ 的习惯——等下章你就知道为什么了。


⚠️ 你踩过这些坑吗

  • [ ] 坑 1:忘记溢出,所有数字都用 intint total = 100000 * 100000; 结果 100 亿,int 装不下。用 long long total = 100000LL * 100000;
  • [ ] 坑 2:整数除法当小数用int a = 10 / 3; 得到 3,不是 3.333。用 double a = 10.0 / 3;
  • [ ] 坑 3:char 和 string 搞混 — 单引号→char(一个字符),双引号→string(一串字符)。char name = "小明"; 是错的!
  • [ ] 坑 4:用 string 忘了 #include <string> — 代码里用了 string name; 但没引入头文件→编译错误。开头加上 #include <string>

📝 练习

基础题

1. 选择题

(1)int 类型占用多少字节?  A. 2   B. 4   C. 8   D. 16

(2)以下哪个数 int 能存?  A. -30 亿   B. -1 亿   C. 50 亿   D. 100 亿

(3)保存"Hello"应该用哪个类型?  A. int   B. char   C. string   D. bool

(4)保存字符 'A' 应该用哪个类型?  A. int   B. char   C. string   D. double

(5)保存"是否及格"应该用哪个类型?  A. int   B. char   C. string   D. bool

2. 填空题

(1)long long 占用 ___ 字节。

(2)如果存的数超过类型能表示的范围,会发生 ____。

(3)char 用 ____ 引号,string 用 ____ 引号。

(4)bool 类型的两个值是 ____ 和 ____。

3. 选择题

(1)以下代码运行后,x 的值是多少?

cpp
int x = 2147483647;
x = x + 1;

  A. 2147483648   B. -2147483648   C. 0   D. 编译错误

(2)sizeof(double) 一般返回多少?   A. 1   B. 4   C. 8   D. 16

4. 代码改错

下面代码有 3 处类型相关的错误,请找出来并改正:

cpp
int pi = 3.14;
char name = "张三";
bool score = "true";

提高题

5. 分析题

下列代码分别输出什么?先自己推算,再上机验证。

cpp
int a = 5 / 2;
double b = 5 / 2;
double c = 5.0 / 2;
cout << a << " " << b << " " << c << endl;

6. 编程题

写程序计算 1 × 2 × 3 × … × 20 的结果。用 int 能装下吗?如果装不下,改用 long long。输出最终的积。

7. 编程题

小明需要记录班上 42 个同学的名字。他想建 42 个 string 变量:string name1, name2, name3, ...。你觉得这个方案好吗?为什么?有没有更好的办法?(不要求写代码,用文字回答并画出你设想的方案。)

挑战题

8. 分类题

以下数据分别应该用什么类型?连一连:

全班人数(45)           string
圆周率(3.14159)        char
你的名字                int
考试等级(A/B/C/D)      bool
今天是否下雨             double

9. 探究题

查一查资料:C++ 中 int 的最小值(负数)是多少?为什么负数的范围比正数大 1?(提示:这和计算机用补码表示负数有关。)


🧠 本章小结

数字类:
  int       — 整数主力(4 字节,约 ±21 亿)
  long long — 大整数(8 字节,约 ±9×10¹⁸)
  double    — 浮点数(8 字节,15 位精度)

文字类:
  char   — 单个字符(1 字节,单引号 'A')
  string — 一串文字(双引号 "Hello",需 #include <string>)

判断类:
  bool   — 真/假(true / false)

溢出:超出容器范围 → 结果错误且不报错

📝 配套练习

共9题。M1最密章节。int/double/char/bool每种至少一题独立的,再用J0004/J0005串联类型选择决策。。★核心(课堂必做) ◆拓展(课后练习)

级别题号链接覆盖知识点
★ 核心J0008https://hydro.ac/d/srqc/p/J0008int、算术、类型选择("为什么不用float")
◆ 拓展J0003https://hydro.ac/d/srqc/p/J0003double、cmath、printf格式化
◆ 拓展luogu-B2017https://hydro.ac/p/luogu-B2017char、ASCII、int↔char转换
◆ 拓展luogu-B2018https://hydro.ac/p/luogu-B2018显式类型转换、char输出
◆ 拓展J0004https://hydro.ac/d/srqc/p/J0004int、逆推计算、while思维
◆ 拓展J0005https://hydro.ac/d/srqc/p/J0005int overflow、long long、类型边界意识
◆ 拓展luogu-B2011https://hydro.ac/p/luogu-B2011double、printf、小数保留
◆ 拓展luogu-B2019https://hydro.ac/p/luogu-B2019bool类型、int↔bool转换
◆ 拓展luogu-B2029https://hydro.ac/p/luogu-B2029double、ceil向上取整、实数→整数需求

💡 练习建议:先完成 1 道★核心题,确保掌握本章基本方法;再完成 8 道◆拓展题,覆盖不同变式和细节。


配套练习

共9题。M1最密章节。int/double/char/bool每种至少一题独立的,再用J0004/J0005串联类型选择决策。★核心(课堂必做) · ◆拓展(课后练习)

级别题号链接覆盖知识点
★ 核心J0008https://hydro.ac/d/srqc/p/J0008int、算术、类型选择("为什么不用float")
◆ 拓展J0003https://hydro.ac/d/srqc/p/J0003double、cmath、printf格式化
◆ 拓展luogu-B2017https://hydro.ac/p/luogu-B2017char、ASCII、int↔char转换
◆ 拓展luogu-B2018https://hydro.ac/p/luogu-B2018显式类型转换、char输出
◆ 拓展J0004https://hydro.ac/d/srqc/p/J0004int、逆推计算、while思维
◆ 拓展J0005https://hydro.ac/d/srqc/p/J0005int overflow、long long、类型边界意识
◆ 拓展luogu-B2011https://hydro.ac/p/luogu-B2011double、printf、小数保留
◆ 拓展luogu-B2019https://hydro.ac/p/luogu-B2019bool类型、int↔bool转换
◆ 拓展luogu-B2029https://hydro.ac/p/luogu-B2029double、ceil向上取整、实数→整数需求

练习建议:先在课堂完成 1 道★核心题,掌握本章基本方法;课后完成 8 道◆拓展题,覆盖不同变式和细节。

自查清单

  • [ ] 我能说出六种类型分别装什么
  • [ ] 我知道 int、long long、double 的区别
  • [ ] 我知道 char(单引号)和 string(双引号)的区别
  • [ ] 我知道 bool 只有 true 和 false
  • [ ] 我知道溢出是什么,如何避免
  • [ ] 我知道整数除法和浮点除法的区别
  • [ ] 我会用 sizeof 查看类型大小

🚀 下章预告:六种类型都认识了。下一章让程序跟你对话——cin 和 cout,真正的交互开始。