【GESP】C++二级考试大纲知识点梳理, (5)编码与 ASCII
GESP 二级考试中,关于编码和字符处理是必考内容。这也是程序与人类交互的基础——计算机如何“理解”我们输入的文字?本篇将深入剖析大纲第 5 条考点。
(5)了解编码的基本概念,了解 ASCII 编码原理,能识别常用字符的 ASCII 码(空格:32、“0”:48、“A”:65、“a”:97),并掌握 ASCII 码和字符之间相互转换的方法。
二级考点系列:
- 【GESP】C++二级考试大纲知识点梳理, (1)计算机存储的基本概念及分类
- 【GESP】C++二级考试大纲知识点梳理, (2)计算机网络的基本概念及分类
- 【GESP】C++二级考试大纲知识点梳理, (3)计算机程序设计语言相关知识
- 【GESP】C++二级考试大纲知识点梳理, (4)流程图
- 【GESP】C++二级考试大纲知识点梳理, (5)编码与 ASCII
- 【GESP】C++二级考试大纲知识点梳理, (6)数据类型转换
- 【GESP】C++二级考试大纲知识点梳理, (7)多层分支结构
- 【GESP】C++二级考试大纲知识点梳理, (8)多层循环结构
- 【GESP】C++二级考试大纲知识点梳理, (9)常用数学函数
一、编码的基本概念
计算机的本质是处理电信号,它只认识 0 和 1(二进制)。为了让计算机也能处理文字、图片、声音,我们需要建立一套规则,把这些信息转换成数字,这个过程就叫编码。
对于文字来说,字符编码就是给每一个字符(字母、数字、标点符号)规定一个唯一的整数编号。当我们在键盘上敲下 A 时,计算机实际接收到的是它的编号,存储的也是这个编号的二进制形式。
二、ASCII 编码原理
ASCII (American Standard Code for Information Interchange,美国信息交换标准代码) 是最基础、最通用的单字节编码系统。
- 存储空间:它使用 1 个字节 (Byte) 中的低 7 位(或 8 位)来表示一个字符。
- 取值范围:标准的 ASCII 码范围是 0 ~ 127。
- 包含内容:
- 控制字符 (0-31):如换行 (
\n, 10)、回车 (\r, 13)、制表符 (\t, 9) 等,主要用于控制输出显示。 - 可打印字符 (32-126):包含空格、标点符号、数字 (0-9)、大写字母 (A-Z)、小写字母 (a-z)。
- 删除字符 (127):DEL。
- 控制字符 (0-31):如换行 (
虽然现在的计算机使用更复杂的 Unicode (如 UTF-8) 来支持中文等多种语言,但 ASCII 码仍然是所有编码系统的基石。英文字符和数字在 UTF-8 中的编码与 ASCII 码完全一致。
三、常用 ASCII 码(重点背诵)
考试大纲明确要求识别以下 4 个关键字符的 ASCII 码。考试时不会给你查表,必须熟记!
| 字符 | ASCII 码 (十进制) | 备注 | 记忆技巧 |
|---|---|---|---|
(空格) | 32 | 可打印字符的起点 | 它是“空”的,但不是0 |
'0' | 48 | 数字字符的起点 | 0 是 48 |
'A' | 65 | 大写字母的起点 | A 是 65 |
'a' | 97 | 小写字母的起点 | a 是 97 |
3.1 规律推导
记住了上面 4 个基准点,其他的就可以推导出来了:
- 数字连续性:
- 数字字符是连续排列的。
'0'是 48'1'是 49- …
'9'是48 + 9 = 57
- 字母连续性:
- 字母也是按字母表顺序连续排列的。
'A'是 65 $\rightarrow$'B'是 66 … $\rightarrow$'Z'是65 + 25 = 90'a'是 97 $\rightarrow$'b'是 98 … $\rightarrow$'z'是97 + 25 = 122
- 大小写转换规律(重要!):
- 小写字母的 ASCII 码 比对应的大写字母 大 32。
- 公式:
ASCII('a') = ASCII('A') + 32 - 即 $97 = 65 + 32$。
- 这个 32 很关键,是大小写转换的“密钥”。
四、ASCII 码与字符的相互转换
在 C++ 中,char 类型在内存中实际上就是以 整数 (ASCII 码) 形式存储的。这意味着 char 和 int 可以自由混用(混合运算和赋值)。
4.1 字符转 ASCII 码 (char $\rightarrow$ int)
将 char 赋值给 int,或者参与整数运算,或者强制类型转换。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
int main() {
char c = 'A';
// 方法1:直接赋值给 int 变量
int code1 = c;
cout << code1 << endl; // 输出 65
// 方法2:使用强制类型转换
cout << (int)c << endl; // 输出 65
// 隐式转换:算术运算
cout << c + 1 << endl; // 'A'(65) + 1 = 66
return 0;
}
4.2 ASCII 码转字符 (int $\rightarrow$ char)
将整数赋值给 char 变量,或者强制类型转换。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int main() {
int n = 98;
// 方法1:直接赋值给 char 变量
char c = n;
cout << c << endl; // 输出 'b' (因为 97是'a', 98是'b')
// 方法2:强制类型转换输出
cout << char(65) << endl; // 输出 'A'
return 0;
}
4.3 经典应用案例
案例 1:大小写互换
输入一个大写字母,输出对应的小写字母。
1
2
3
4
char upper = 'G';
// 方法:加上 32
char lower = upper + 32;
cout << lower; // 输出 'g'
思考:如果是小写转大写呢?减去 32 即可!
案例 2:数字字符转数值
输入一个字符 ‘5’,如何把它变成整数 5 ?
错误做法:(int)'5' $\rightarrow$ 结果是 53 (ASCII码),不是 5。 正确做法:减去 ‘0’ 的 ASCII 码。
1
2
3
char c = '5';
int num = c - '0'; // 53 - 48 = 5
cout << num; // 输出 5
案例 3:凯撒密码(简单的字符偏移)
将字符向后移动一位(’A’ 变 ‘B’)。
1
2
3
char c = 'A';
c = c + 1; // 变成 66
cout << c; // 输出 'B'
五、易错点总结
- 混淆
'0'和0:0是整数零,逻辑上的 False,ASCII 码为 0 的字符是 Null (空字符)。'0'是字符零,显示的符号,ASCII 码是 48。
- 混淆空格和空字符:
- 空格 (Space) 的 ASCII 是 32,是能打印出来的空白。
- 空字符 (
\0) 的 ASCII 是 0,通常用于标记字符串的结束。
- 计算越界:
char只有 1 个字节,通常范围是 -128 到 127。如果char c = 127; c = c + 1;可能会溢出变成负数(具体取决于 char 是否 signed),导致乱码。但在 ASCII 处理范围内(0-127)通常是安全的。
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
“luogu-”系列题目可在洛谷题库进行在线评测。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
