Skip to content

第5章 基本数据类型 ​


🎯 本章学习目标 ​

读完本章,你将能够:

  • ✅ 说出 C++ 一级要求掌握的 6 种基本数据类型及其占字节数
  • ✅ 掌握 int 和 long long 的取值范围,知道什么时候该用 long long
  • ✅ 理解整数溢出的概念和现象,能判断题目是否需要用 long long
  • ✅ 区分 float 和 double,知道默认使用 double
  • ✅ 理解小数是近似存储的,知道 0.1+0.2 不精确等于 0.3
  • ✅ 掌握整数除法"截断小数"的特性,能预测 3/2 的结果
  • ✅ 熟练使用 char 类型,记住三个关键 ASCII 码('0'=48, 'A'=65, 'a'=97)
  • ✅ 理解字符和整数的关系,能进行字符运算(如 'a'+1='b')
  • ✅ 掌握 bool 类型的两个值和"非 0 即真"规则
  • ✅ 能根据题目需求选择合适的数据类型

🗺️ 本章知识图谱 ​

第5章 基本数据类型
├── 一、数据类型是什么
│   └── 变量=盒子,类型=盒子型号(决定大小和装什么)
├── 二、整数型
│   ├── int:4字节,约±21亿
│   ├── 溢出:最大值+1绕回最小值
│   └── long long:8字节,约±920亿亿,大数加LL
├── 三、实数型(浮点型)
│   ├── float:4字节,6~7位有效数字
│   ├── double:8字节,15~16位有效数字(常用)
│   ├── 小数是近似存储(0.1+0.2≠0.3精确值)
│   └── 整数除法截断小数:3/2=1,3.0/2=1.5
├── 四、字符型 char
│   ├── 1字节,单引号,一个字符
│   ├── ASCII码:'0'=48, 'A'=65, 'a'=97
│   ├── 大小写差32:'a'-'A'=32
│   ├── 字符运算:'a'+1='b'
│   └── '0' ≠ 0(字符零 vs 整数零)
├── 五、布尔型 bool
│   ├── true/false(全小写)
│   ├── cout默认输出1/0
│   └── 非0即真
└── 六、类型大小汇总与选用
    ├── sizeof运算符
    └── 选型建议:日常int、大数long long、小数double

一、数据类型是什么?——C++ 的盒子有"固定大小" ​

生活中装东西要看容器:装零食有小密封袋,装书本有书包,装棉被有大号收纳箱。东西多大,就用多大的盒子。

C++ 的变量也是这个道理。每定义一个变量,计算机都会在内存里给它安排一个"小盒子",而盒子的型号,就是数据类型。一级阶段要认识六种:

类型名中文叫法生活比喻例子占内存
int整型普通书包,装日常整数10、-3、04 字节
long long长整型超大号收纳箱,装特别大的整数1000000000008 字节
float单精度浮点型小水杯,装小数(精度一般)3.14f4 字节
double双精度浮点型大量杯,装小数(精度高,最常用)3.14、1.58 字节
char字符型单个格子,只放一个字符'A'、'0'、'?'1 字节
bool布尔型电灯开关,只有开/关两档true、false1 字节

📌 小提示:定义变量的完整语法是 类型名 变量名 = 值;,类型名必须写在最前面,这就是上一章学的"先声明、后使用"。

🍎 C++ 和其他语言的最大不同:C++ 的盒子出厂就定好了大小,一个 int 盒子永远只有 4 字节,塞太大的数会"溢出"出错;而有些语言的盒子像橡皮筋口袋,多大的数都装得下。所以 C++ 程序员必须养成"选对盒子"的习惯——这正是本章的核心考点!


💡 什么是字节? ​

你可能会问:"字节"是什么?为什么用它来衡量大小?

简单来说,计算机里存储数据的最小单位叫"位"(bit),每一位只能存 0 或 1,就像一个电灯开关——只有开和关两种状态。

8 个位组成一个"字节"(Byte),这是计算机里最常用的基本存储单位:

1 字节 = 8 位(bit)
1 KB = 1024 字节
1 MB = 1024 KB
1 GB = 1024 MB

打个比方:位就像单个灯泡,字节就像 8 个灯泡排成一排——8 个灯泡的明灭组合可以表示 2⁸ = 256 种不同状态。所以 1 字节可以存 256 个不同的值,4 字节(int)可以存 2³² ≈ 42 亿个不同的值(分一半给负数,所以 int 范围约 ±21 亿)。


二、整数型:int 与 long long ​

2.1 int:最常用的整数盒子 ​

int 是 integer(整数)的缩写,专门装没有小数点的数:班级人数、年龄、考试分数、温度……

cpp
int age = 10;        // 正整数
int temp = -3;       // 负整数
int count = 0;       // 零也是整数

int 占 4 个字节,也就是 32 个二进制位,其中一位用来表示正负,所以它能装的范围是:

int 的范围:约 -21 亿 ~ 21 亿(准确说是 -2³¹ ~ 2³¹-1,即 -2147483648 ~ 2147483647)

21 亿有多大?全世界人口约 80 亿,已经超过了;但一个学校的人数、一年的秒数(约 3153 万)都装得下。所以平时做题,整数用 int 基本够用。

2.2 溢出:盒子装不下会"撑爆" 🔥 ​

如果硬把超过 21 亿的数塞进 int 盒子,会发生什么?——溢出(overflow),结果会错得离谱!

cpp
#include <iostream>
using namespace std;
int main() {
    int a = 2147483647;      // int 的最大值
    cout << a << endl;       // 2147483647(还装得下)
    cout << a + 1 << endl;   // -2147483648(溢出!最大值+1竟变成最小值)
    return 0;
}

🍎 小比喻:这就像老式里程表,数字走到 99999 之后再走一格,"咔哒"一下又回到 00000。int 盒子装满后再加 1,就会"绕回"最小的负数。在常见编译器上,2147483647 + 1 会得到 -2147483648——在大多数常见编译器上会输出 -2147483648,但这是未定义行为,标准不保证任何结果。考试中判断‘int最大值+1’的结果,按常见编译器填写即可,但要记住这本质上是‘程序已出错’。

高频考点 🔥: 题目里出现"全国人口""几十亿""大数求和"等字眼,或者数据可能超过 21 亿,就要立刻警觉:int 装不下,必须用 long long!溢出题是选择题、程序阅读题的常客。

2.3 long long:超大号整数盒子 ​

long long 占 8 个字节(64 位),能装的范围约是:

long long 的范围:约 ±9.2×10¹⁸(也就是 ±920 亿亿,天文数字级别)

什么样的数需要它?比如统计 1 到 100 亿的和、存一个身份证号那么长的数字:

cpp
#include <iostream>
using namespace std;
int main() {
    long long big = 123456789012345LL;   // 超大数,末尾加 LL 表示"这是 long long 数"
    cout << big << endl;                 // 123456789012345
    cout << big * 2 << endl;             // 246913578024690,稳稳装下
    return 0;
}

⚠️ 易错点: 书写超大的整数常量时,建议在数字末尾加上 LL(两个大写或小写 L),明确告诉计算机"这是个 long long 大数"。例如 100000000000LL。如果只写 100000000000,某些编译器可能先按 int 处理,装不下就已经出错了。

整数选型口诀:日常整数用 int,超过 21 亿用 long long。


🔍 深度辨析:什么时候必须用 long long? ​

很多同学拿到题就写 int,结果答案错了才发现溢出了。教你几个判断信号:

题目场景要不要用 long long原因
班级人数、年龄、分数❌ 不用一般几百、几十,int 绰绰有余
一年的天数、秒数❌ 不用一年约 3153 万秒,远小于 21 亿
全国/全球人口✅ 要用80 亿 > 21 亿
求 1 到 N 的和(N 很大)⚠️ 看情况N=10万时和约50亿,已超int;N=1万时约5000万,int够
两个 int 相乘⚠️ 小心两个 10 万相乘 = 100 亿,直接溢出

💡 保命技巧:做编程题时,如果拿不准会不会溢出,直接用 long long!大不了多占 4 个字节,现在的电脑完全不在乎。与其纠结"够不够",不如直接用大盒子,保险。


三、实数型:float 与 double ​

3.1 小数在计算机里是"近似存储" ​

身高 1.45 米、体重 32.5 千克、圆周率 3.14159……带小数点的数,C++ 用浮点型来装:float 和 double。

这里有个重要观念:计算机存小数,存的是"近似值"。就像十进制没法把 1÷3 除尽(0.3333…),二进制也没法把 0.1 精确表示,只能存一个非常非常接近的数:

cpp
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    double x = 0.1 + 0.2;
    cout << x << endl;                          // 0.3(默认显示6位,看着正常)
    cout << setprecision(17) << x << endl;      // 0.30000000000000004(放大看,有微小误差)
    return 0;
}

易错点 ⚠️: 判断题如果说"计算机可以精确存储所有小数"——错误!小数是近似存储的,浮点运算可能出现极微小的误差。一级阶段知道这个现象即可,不需要深究原因。

3.2 float 与 double:精度大比拼 ​

两种小数盒子的区别在于"能记多准":

类型占内存有效数字比喻建议
float4 字节6~7 位小水杯,刻度粗略少用
double8 字节15~16 位大量杯,刻度精细默认就用它
cpp
float f = 3.14f;      // float 常量末尾加 f
double d = 3.14;      // 小数默认就是 double,最常用
cout << f << endl;    // 3.14
cout << d << endl;    // 3.14

🍎 小比喻:float 像只能量到"毫米"的尺子,double 像能量到"微米"的尺子。量身高、算数学题,直接用 double 准没错,这也是考试和实际编程中最常用的小数类型。

3.3 整数盒子装小数:尾巴会被"砍光" ⚠️ ​

如果你用 int 盒子去装小数,计算机会毫不留情地把小数部分整个砍掉(不是四舍五入,是直接截断):

cpp
#include <iostream>
using namespace std;
int main() {
    int a = 3.99;
    cout << a << endl;        // 3!小数部分 .99 被直接扔掉,不是 4

    double b = 3 / 2;         // 注意:3 和 2 都是整数,先按整数除法算
    cout << b << endl;        // 1!算出整数 1 后才放进 double,变成 1

    double c = 3.0 / 2;       // 3.0 是小数,小数参与运算,结果才是小数
    cout << c << endl;        // 1.5
    return 0;
}

易错点 ⚠️(超高频): double b = 3 / 2; 输出的是 1 而不是 1.5!因为等号右边先算 3 / 2,两个 int 相除按"整数除法"规则得到 1,再把 1 转成 1.0 放进 b。想得到 1.5,至少要有一个数写成小数(3.0 / 2 或 3 / 2.0)。整数除法的完整规则,第7章《运算符》会专门细讲,本章先记住:装小数要用 double,别用 int。


🧩 考点深挖:为什么 0.1 + 0.2 ≠ 0.3? ​

这是计算机界最著名的"冷知识"之一。原因其实很简单:

我们日常用的是十进制(逢十进一),而计算机用的是二进制(逢二进一)。

在十进制里,有些分数"除不尽",比如 1/3 = 0.3333…… 只能写个近似值。

同样,在二进制里,也有很多小数"除不尽",0.1 就是其中一个。把 0.1 转换成二进制,会得到一个无限循环的小数:

0.1(十进制)≈ 0.00011001100110011...(二进制,无限循环)

计算机的存储空间有限(double 只有 64 位),没法存无限长的小数,只能存个近似值。所以 0.1 和 0.2 在计算机里都不是精确值,加起来自然也不会精确等于 0.3。

💡 考试怎么考? 一级只考判断:"计算机可以精确存储所有小数"——❌ 错误。知道"小数是近似存储"这个结论就够了,不需要推导二进制转换过程。


四、字符型 char:只装"一个字符" ​

4.1 字符必须用单引号 ​

char 盒子专门装单个字符:一个字母、一个数字符号、一个标点。书写时要用英文单引号 ' ' 包起来:

cpp
char grade = 'A';     // 一个大写字母
char ch = 'b';        // 一个小写字母
char num = '0';       // 数字符号零(注意是字符,不是整数0)
char mark = '?';      // 一个标点符号
cout << grade << endl;   // A

两条铁律:

  1. char 只能装一个字符:'AB' 放了两个字符,一个 char 装不下(多字符常量虽然能编译、通常只警告,但值为实现定义);一个汉字也装不进 char(汉字在计算机里占多个字节)。
  2. 必须用单引号,不能用双引号:"A" 是双引号包起来的字符串,不能放进 char 盒子,编译会报错!

易错点 ⚠️: 判断题"字符用双引号括起来,如 "A""——错误!字符用单引号 'A';双引号 "A" 是字符串(第8章输入输出还会见面)。口诀:字符单引号,字符串双引号。

4.2 字符的秘密:它本质上是一个编号(ASCII 码)(📚 拓展 · 超纲) ​

📚 拓展 · 超纲:ASCII 编码属于二级考纲,一级只要求"字符型 char 的定义与使用"。了解即可,不必背诵码表。

计算机内部其实只认识数字,所以每个字符都对应一个编号,这套编号表叫 ASCII 码。一级需要记住三个常用编号:

字符ASCII 编号说明
'0'48数字字符从 48 开始:'1'=49、'2'=50……
'A'65大写字母从 65 开始:'B'=66……
'a'97小写字母从 97 开始:'b'=98……

💡 发现了吗?'a' - 'A' = 97 - 65 = 32,同一个字母的小写比大写大 32,这个小规律考试偶尔会考到。

既然字符本质是编号,它就能和整数互相转换:

cpp
#include <iostream>
using namespace std;
int main() {
    char c = 'A';
    cout << c << endl;        // A    (char 盒子,输出字符本身)
    cout << (int)c << endl;   // 65   ((int) 把字符转成整数,看到编号)

    int n = 97;
    cout << (char)n << endl;  // a    ((char) 把整数转成字符)
    return 0;
}

4.3 趣味玩法:'a' + 1 得到 'b' 🔥 ​

字符拿着编号参加运算,就能玩出"字母接龙":

cpp
#include <iostream>
using namespace std;
int main() {
    char c = 'a';
    cout << (char)(c + 1) << endl;    // b   ('a'编号97,+1变98,转回字符是'b')
    cout << (char)(c + 2) << endl;    // c
    cout << (char)('A' + 3) << endl;  // D
    cout << '0' + 1 << endl;          // 49  (注意!直接输出是编号49,不是'1')
    cout << (char)('0' + 1) << endl;  // 1   (转回 char,才是字符'1')
    return 0;
}

高频考点 🔥: '0' 和 0 是完全不同的两回事!

  • 0 是整数零,表示数量"没有",数值就是 0;
  • '0' 是字符零,长相像数字,本质是编号 48。

同理,'9' 不等于 9(它是 57),'A' 不等于 A 这个变量。题目里看到带单引号的数字,一定要提醒自己:"这是字符,它的值是 ASCII 编号!"


🧩 拓展(📚 超纲):ASCII 码表的规律 ​

ASCII 码表一共有 128 个字符(编号 0~127),不用全背,记住三个起点就能推导出一大片:

编号 48 → '0'  → 数字字符(48~57,共10个)
编号 65 → 'A'  → 大写字母(65~90,共26个)
编号 97 → 'a'  → 小写字母(97~122,共26个)

规律 1:同组字符是连续的。比如 'A'=65,'B'=66,'C'=67…… 'Z'=90。

规律 2:小写字母 = 大写字母 + 32。比如 'a' = 'A' + 32 = 97。

规律 3:数字字符的编号减去 '0' 的编号,就得到对应的整数值。比如:

  • '5' - '0' = 53 - 48 = 5(字符 5 转成整数 5)
  • 0 + '0' = 48 → 即字符 '0'(整数 0 转成字符 '0')

这第三条规律在二级、三级的字符串处理题目中超级有用,先记下来以后会用到!


五、布尔型 bool:只会回答"真"和"假" ​

5.1 全世界只有两个布尔值 ​

bool(布尔)型是最简单的类型,只有两个值:

值含义像什么
true真、对、条件成立电灯开
false假、错、条件不成立电灯关
cpp
bool passed = true;     // 通过了
bool finished = false;  // 还没完成

注意:C++ 里 true 和 false 都是小写关键字,不能大写写成 True(这和有些语言不同,别记混)。

5.2 cout 输出 bool:默认显示 1 和 0 ​

布尔值在内存里其实就是用整数表示的:true 相当于 1,false 相当于 0。所以用 cout 直接输出,看到的是数字:

cpp
#include <iostream>
using namespace std;
int main() {
    bool flag = true;
    cout << flag << endl;            // 1   (默认输出数字 1)
    cout << false << endl;           // 0
    cout << boolalpha << flag;       // true(加 boolalpha,才输出单词 true)
    return 0;
}

易错点 ⚠️: 程序阅读题里 cout << true; 输出的是 1,cout << false; 输出的是 0!想输出单词 true/false,要先写 boolalpha。考试默认情况一律按 1/0 判断。

5.3 非 0 即真 ​

布尔值还有个重要脾气:凡是"非 0"的值,都当作真;只有 0 才是假:

cpp
#include <iostream>
using namespace std;
int main() {
    bool a = 5;      // 5 不是 0 → 当作 true
    cout << a << endl;   // 1
    bool b = -1;     // -1 也不是 0 → 也是 true!
    cout << b << endl;   // 1
    bool c = 0;      // 只有 0 → false
    cout << c << endl;   // 0
    return 0;
}

🍎 小比喻:bool 像一个验票员,只问"票上数字是不是 0"。是 0 就摆手(假),只要不是 0——不管是 1、5 还是 -100——统统放行(真)。这个规则下一章《三大基本结构》写 if 判断时会经常用到。

另外提前剧透:第7章会学到比较运算符(>、<、==、!= 等),它们的运算结果就是 bool 值。比如 3 > 2 成立,结果就是 true(输出 1);3 < 2 不成立,结果就是 false(输出 0)。本章只要先认识 bool 这两个值、记住"非 0 即真",下一章学分支结构时就能无缝衔接。


🔍 深度辨析:bool 类型的来源 ​

"布尔"(bool)这个名字是为了纪念一位数学家——乔治·布尔(George Boole)。他在 19 世纪发明了"布尔代数",专门研究"真"和"假"两种值的运算规律(与、或、非)。

一百多年后,计算机科学家发现这套数学体系完美适用于计算机——因为计算机的电路就是"通(真)"和"断(假)"两种状态。于是就用他的名字命名了布尔类型。

💡 冷知识:C 语言早期其实没有 bool 类型,直接用整数 0 和 1 表示真假。C++ 从 C 语言演化而来,保留了"非 0 即真"的传统,后来才新增了 bool 关键字和 true/false 值。这也是为什么 bool 值和整数可以自由转换的历史原因。


六、类型大小对比与选用建议 ​

6.1 用 sizeof 量一量盒子大小 ​

C++ 提供了 sizeof(类型) 运算符,可以量出每种类型占几个字节:

cpp
#include <iostream>
using namespace std;
int main() {
    cout << sizeof(int) << endl;        // 4
    cout << sizeof(long long) << endl;  // 8
    cout << sizeof(float) << endl;      // 4
    cout << sizeof(double) << endl;     // 8
    cout << sizeof(char) << endl;       // 1
    cout << sizeof(bool) << endl;       // 1
    return 0;
}

6.2 一表汇总(必背)🔥 ​

类型占内存装什么范围 / 精度选用建议
int4 字节整数-2³¹~2³¹-1(约 ±21 亿)人数、年龄、分数等日常整数
long long8 字节大整数约 ±9.2×10¹⁸超过 21 亿的大数、大数求和
float4 字节小数6~7 位有效数字一般不用
double8 字节小数15~16 位有效数字小数默认选它
char1 字节单个字符存 ASCII 编号('A'=65 等)字母、数字符号、标点
bool1 字节真假true(1) / false(0)条件、开关

高频考点 🔥: 这张表的"占内存"一列几乎是送分题:int 4、long long 8、float 4、double 8、char 1。记忆小窍门:盒子越大装得越多——8 字节的 long long 比 4 字节的 int 装得大,8 字节的 double 比 4 字节的 float 算得准。


💡 选型决策树 ​

考试时拿到题,怎么快速决定用什么类型?按下面的流程图走:

题目需要存什么?
    │
    ├─→ 只有"是/否"两种情况 → bool
    │
    ├─→ 单个字母/符号 → char
    │
    ├─→ 没有小数点的整数 → 数字大不大?
    │     ├─ 不大(几百万以内)→ int
    │     └─ 很大(几十亿以上)→ long long
    │
    └─→ 带小数点的数 → double(默认就用它,不用想 float)

七、课堂综合演示 ​

六种类型一次看齐,建议亲手敲一遍:

cpp
#include <iostream>
using namespace std;
int main() {
    // 1. 整数
    int age = 10;
    long long stars = 100000000000LL;
    cout << age << endl;       // 10
    cout << stars << endl;     // 100000000000

    // 2. 小数
    double height = 1.45;
    cout << height << endl;    // 1.45
    cout << 3 / 2 << endl;     // 1(整数除法,尾巴砍光)
    cout << 3.0 / 2 << endl;   // 1.5(有小数参与)

    // 3. 字符
    char grade = 'A';
    cout << grade << endl;          // A
    cout << (int)grade << endl;     // 65
    cout << (char)('a' + 1) << endl;// b

    // 4. 布尔
    bool ok = true;
    cout << ok << endl;             // 1
    cout << (bool)(5) << endl;      // 1(非0即真)
    return 0;
}

八、四大易错点汇总 ⚠️ ​

#易错点错误写法正确做法
1大数忘记用 long long,int 溢出int x = 100000000000;long long x = 100000000000LL;
2用整型变量装小数,尾巴被截断int x = 3.99;(得 3)double x = 3.99;
3字符漏写单引号、误用双引号char c = "A";(报错)char c = 'A';
4char 里塞多个字符char c = 'AB';(通常只警告,值为实现定义)一个 char 只放一个字符

另外再补三个"判断题刺客":

  • '0' 和 0 不是一回事(字符 '0' 的编号是 48);
  • cout << true; 输出 1,不是单词 true;
  • 小数是近似存储,0.1 + 0.2 不完全等于 0.3。

九、深度专题(📚 拓展 · 超纲):类型转换——不同类型的盒子怎么"打交道" ​

📚 拓展 · 超纲:数据类型的转换属于二级考纲。一级遇到"整数除法陷阱"时了解即可,不必深究转换规则。

考试里经常出现"int 和 double 一起运算会怎样""int 除以 int 为什么得 int"这种题。这一节把类型转换讲透。

9.1 什么是类型转换? ​

当不同类型的数据放在一起运算时,C++ 会自动把它们"变成同一种类型"再计算,这就叫隐式类型转换(也叫"自动类型转换")。

🍎 生活比喻:就像你把橘子和苹果放进同一个袋子里称重——橘子不会变成苹果,但秤会用同一个单位(克)来告诉你总重量。类型转换就是"统一单位"的过程。

9.2 转换规则:"小的"自动变"大的" ​

基本原则:在运算或赋值时,"表示能力较弱"的类型会自动转换成"表示能力较强"的类型(以能表示的范围和精度为准,并不单纯比字节数——例如 long long 会转换成 float,因为 float 能表示的范围更大,尽管它只有 4 字节;大整数转 float 时可能丢失精度)。

从小到大的顺序(一级要求掌握的):

bool → char → int → long long → float → double
  1B    1B     4B       8B        4B        8B
运算组合结果类型例子
int + intint3 + 2 = 5(还是整数)
int + doubledouble3 + 2.5 = 5.5(int 自动升级成 double)
int * floatfloat3 * 2.0f = 6.0f
char + intint'A' + 1 = 66(char 转成 ASCII 码的 int)
bool + intinttrue + 1 = 2(true 变 1,false 变 0)

9.3 ⚠️ 最常考:整数除法陷阱 ​

这是一级考试排名第一的易错点,几乎每张卷子都考!

cpp
int a = 5;
int b = 2;
cout << a / b << endl;      // 输出 2,不是 2.5!

为什么是 2? 因为 a 和 b 都是 int,两个 int 相除,结果还是 int——小数部分直接被砍掉了(截断取整,不是四舍五入)。

怎么得到小数结果? 至少让其中一个变成 double:

cpp
// 方法1:用 double 变量
double a = 5.0;
int b = 2;
cout << a / b << endl;      // 输出 2.5

// 方法2:乘以 1.0 强制转 double
int sum = 5, n = 2;
cout << sum * 1.0 / n << endl;  // 输出 2.5

🔥 考试口诀:整型除以整型,结果还是整型(小数部分直接丢掉)。想要小数结果,必须至少有一个操作数是小数类型!

9.4 强制类型转换(显式转换) ​

除了自动转换,你也可以手动把一个值转成另一种类型,这叫强制类型转换。

写法:(目标类型)值 或 目标类型(值)

cpp
int x = 5;
double y = (double)x;       // 把 int 的 x 强制转成 double
cout << y << endl;          // 输出 5(但它现在是 double 类型了)

double pi = 3.14159;
int z = (int)pi;            // 把 double 强制转成 int(小数被砍掉)
cout << z << endl;          // 输出 3

⚠️ 注意:把"大盒子"的值塞进"小盒子"(比如 double 转 int),会丢失精度——小数部分直接砍掉,不是四舍五入!(int)3.99 的结果是 3,不是 4。

9.5 类型转换三大考点总结 🔥 ​

考点题目特征关键结论
整数除法两个 int 相除问结果结果是 int,小数被截断(不是四舍五入)
混合运算int 和 double 一起算结果是 double(小的自动升级成大的)
强制转换(int)3.99 等于多少等于 3(直接砍掉小数)

十、📝 实战练习 ​

练习题 1(单选题) ​

题目: 下列变量定义中,正确的是( )

  • A. char c = "A";
  • B. bool b = "true";
  • C. double pi = 3.14;
  • D. char ch = 'AB';
🔑 点击查看答案与解析

答案: C

解析: A 字符用了双引号(双引号是字符串),编译报错;B 布尔值不能写成带引号的文字,应直接写 true;D 一个 char 只能装一个字符;C 用 double 装小数,完全正确。


练习题 2(单选题) ​

题目: int 类型能存放的整数范围约为( )

  • A. -128 ~ 127
  • B. -21 亿 ~ 21 亿
  • C. ±9.2×10¹⁸
  • D. 没有大小限制
🔑 点击查看答案与解析

答案: B

解析: int 占 4 字节,范围是 -2³¹~2³¹-1,约 ±21 亿;C 是 long long 的范围;D 是错误观念,C++ 整数有明确范围,超了会溢出。


练习题 3(单选题) ​

题目: 已知 char c = 'a';,则表达式 (char)(c + 1) 的值是( )

  • A. 'a'
  • B. 'b'
  • C. 98
  • D. "b"
🔑 点击查看答案与解析

答案: B

解析: 'a' 的 ASCII 编号是 97,加 1 得 98,再用 (char) 转回字符,就是 'b'。注意:若不加 (char) 直接 cout << c + 1,输出的是数字 98。


练习题 4(判断题) ​

题目: 在 C++ 中,字符 '0' 和整数 0 是完全相同的,可以互换使用。( )

🔑 点击查看答案与解析

答案: ❌ 错误

解析: 0 是整数零,数值为 0;'0' 是字符,其 ASCII 编号为 48。两者类型不同、值也不同,不能画等号。


练习题 5(程序阅读题) ​

题目: 阅读程序,写出 5 行输出:

cpp
int a = 2147483647;
cout << a + 1 << endl;
cout << 3 / 2 << endl;
cout << 3.0 / 2 << endl;
cout << (int)'A' << endl;
cout << true << endl;
🔑 点击查看答案与解析

答案:

-2147483648
1
1.5
65
1

解析: ① int 最大值加 1 溢出,常见编译器上绕回最小值 -2147483648;② 两整数相除,小数部分被砍,得 1;③ 3.0 是小数,结果 1.5;④ 'A' 的 ASCII 编号是 65;⑤ bool 值 true 用 cout 默认输出 1。


练习题 6(单选题) ​

题目: 下列关于 C++ 数据类型的说法,正确的是( )

A. float 类型精度比 double 高 B. int 类型占 8 个字节 C. 小数在计算机中是精确存储的 D. char 类型占 1 个字节,只能存一个字符

🔑 点击查看答案与解析

答案: D

解析:

  • A ❌:double(15~16位)比 float(6~7位)精度高;
  • B ❌:int 占 4 字节,long long 才占 8 字节;
  • C ❌:小数是近似存储的,不是精确的;
  • D ✅:char 占 1 字节,只存一个字符,正确。

选 D。


练习题 7(程序阅读题) ​

题目: 以下代码的输出结果是( )

cpp
cout << (char)('A' + 5) << " " << ('Z' - 'A');

A. F 25 B. E 25 C. F 26 D. E 26

🔑 点击查看答案与解析

答案: A

解析:

  • 'A' 编号 65,加 5 得 70,对应字符 'F';
  • 'Z' 编号 90,'A' 编号 65,90 - 65 = 25(注意:A 到 Z 共 26 个字母,但差值是 25)。

选 A。


练习题 8(判断题) ​

题目: long long 类型可以存放任意大的整数,永远不会溢出。( )

🔑 点击查看答案与解析

答案: ❌ 错误

解析: long long 虽然很大(约 ±920 亿亿),但也是有限的。只要数字足够大,long long 也会溢出。只不过它的范围比 int 大得多,日常做题基本碰不到上限。C++ 中没有"永远不会溢出"的整数类型。


练习题 9(程序阅读题) ​

题目: 下列代码输出几行 1?( )

cpp
cout << (bool)5 << endl;
cout << (bool)-3 << endl;
cout << (bool)0 << endl;
cout << (bool)true << endl;

A. 1 行 B. 2 行 C. 3 行 D. 4 行

🔑 点击查看答案与解析

答案: C

解析: "非 0 即真":

  • 5 不是 0 → 真 → 输出 1 ✅
  • -3 不是 0 → 真 → 输出 1 ✅
  • 0 → 假 → 输出 0 ❌
  • true 本身就是真 → 输出 1 ✅

共 3 行输出 1。选 C。


练习题 10(单选题) ​

题目: 以下表达式中,值为 1.5 的是( )

A. 3 / 2 B. 3.0 / 2 C. (int)(3.0 / 2) D. 3 / 2.0 的整数部分

🔑 点击查看答案与解析

答案: B

解析:

  • A ❌:两个 int 相除,整数除法得 1;
  • B ✅:3.0 是 double,和 2 运算时 2 自动转成 double,结果是 1.5;
  • C ❌:(int) 强制转换为整数,小数被砍掉,得 1;
  • D ❌:整数部分是 1。

选 B。


练习题 11(单选题) ​

题目: 有代码 int a = 7; double b = 2.0; cout << a / b << endl;,输出结果是( )

A. 3  B. 3.5  C. 3.0  D. 2

🔑 点击查看答案与解析

答案: B

解析: a 是 int(7),b 是 double(2.0)。两个不同类型一起运算时,小的自动升级成大的——int 的 a 会自动转成 double,然后两个 double 相除,结果是 double 类型的 3.5。

💡 口诀:整型遇小数,自动升小数。只要有一个操作数是 double,结果就是 double。


练习题 12(判断题) ​

题目: 判断:(int)(3.99) 的结果是 4,因为会四舍五入。( )

🔑 点击查看答案与解析

答案: ❌ 错误

解析: 强制类型转换 (int) 是直接砍掉小数部分,不是四舍五入。(int)(3.99) 的结果是 3,不是 4。

⚠️ 这是经典判断题陷阱!很多同学以为会四舍五入,实际是"截断取整"——直接把小数点后面的全部扔掉。


十一、📊 考点总结表 ​

考点重要程度出题形式
int 范围约 ±21 亿(-2³¹~2³¹-1),占 4 字节⭐⭐⭐⭐⭐选择/判断
long long 范围约 ±9.2×10¹⁸,占 8 字节,大数用它⭐⭐⭐⭐⭐选择/程序阅读
int 溢出:最大值加 1 结果出错(常见为 -2147483648)⭐⭐⭐⭐⭐选择/程序阅读
大整数常量末尾加 LL⭐⭐⭐判断/程序阅读
float 6~7 位有效数字、double 15~16 位(8字节,常用)⭐⭐⭐⭐选择/判断
小数近似存储,0.1+0.2 有微小误差(知道即可)⭐⭐判断
int 装小数被截断:3.99 变 3、3/2 得 1⭐⭐⭐⭐⭐选择/程序阅读
char 占 1 字节,只装单个字符,用单引号⭐⭐⭐⭐⭐选择/判断
双引号 "A" 是字符串,不能赋给 char⭐⭐⭐⭐判断
ASCII:'0'=48、'A'=65、'a'=97;大小写差 32⭐⭐⭐⭐选择/判断
字符与整数互转:(int)'A'=65、'a'+1='b'⭐⭐⭐⭐⭐程序阅读
'0' 与 0 不同(48 vs 0)⭐⭐⭐⭐⭐选择/判断
bool 只有 true/false(小写),cout 默认输出 1/0⭐⭐⭐⭐选择/程序阅读
非 0 即真:5、-1 都为真,只有 0 为假⭐⭐⭐⭐判断/程序阅读
类型大小:int 4、long long 8、float 4、double 8、char 1、bool 1⭐⭐⭐⭐选择
选型决策:日常用int/大数long long/小数double⭐⭐⭐⭐⭐编程

┌──────────────────────────────────────────────────────────────┐
│                ⭐ 第5章必背速记卡(基本数据类型)                 │
├──────────────────────────────────────────────────────────────┤
│  1. 类型大小:int=4, long long=8, float=4, double=8,         │
│     char=1, bool=1(字节)                                   │
│  2. int范围约±21亿;超过21亿用long long,大数末尾加LL        │
│  3. int溢出:最大值+1绕回最小值(类似里程表归零)             │
│  4. 小数默认用double(15~16位精度),float少用               │
│  5. 小数是近似存储,0.1+0.2不精确等于0.3                     │
│  6. 整数除法截断小数:3/2=1,3.0/2=1.5                      │
│  7. char用单引号,一个字符;双引号是字符串                    │
│  8. ASCII必背:'0'=48, 'A'=65, 'a'=97                       │
│  9. 大小写差32:'a'-'A'=32                                   │
│ 10. '0'≠0(字符零是48,整数零是0)                           │
│ 11. 字符运算:'a'+1='b';加完要用(char)转回字符               │
│ 12. bool只有true/false(全小写),cout默认输出1/0            │
│ 13. 非0即真:只要不是0都是真(包括负数!)                    │
│ 14. sizeof(类型)可测量类型占几个字节                          │
│ 15. 选型口诀:日常int、大数long long、小数double              │
└──────────────────────────────────────────────────────────────┘

📖 下章预告:第6章我们将学习 C++ 的三大基本结构——顺序结构、分支结构(if/else)、循环结构(for/while)。这是编程的"骨架",学会了它们,你就能让程序"自己做判断"、"自动重复做事",真正开始解决实际问题了!

百炼成钢,融会贯通