文章

【GESP】C++二级考试大纲知识点梳理, (5)编码与 ASCII

GESP 二级考试中,关于编码和字符处理是必考内容。这也是程序与人类交互的基础——计算机如何“理解”我们输入的文字?本篇将深入剖析大纲第 5 条考点。

(5)了解编码的基本概念,了解 ASCII 编码原理,能识别常用字符的 ASCII 码(空格:32、“0”:48、“A”:65、“a”:97),并掌握 ASCII 码和字符之间相互转换的方法。

二级考点系列:


一、编码的基本概念

计算机的本质是处理电信号,它只认识 01(二进制)。为了让计算机也能处理文字、图片、声音,我们需要建立一套规则,把这些信息转换成数字,这个过程就叫编码

对于文字来说,字符编码就是给每一个字符(字母、数字、标点符号)规定一个唯一的整数编号。当我们在键盘上敲下 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。

虽然现在的计算机使用更复杂的 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 个基准点,其他的就可以推导出来了:

  1. 数字连续性
    • 数字字符是连续排列的。
    • '0' 是 48
    • '1' 是 49
    • '9'48 + 9 = 57
  2. 字母连续性
    • 字母也是按字母表顺序连续排列的。
    • 'A' 是 65 $\rightarrow$ 'B' 是 66 … $\rightarrow$ 'Z'65 + 25 = 90
    • 'a' 是 97 $\rightarrow$ 'b' 是 98 … $\rightarrow$ 'z'97 + 25 = 122
  3. 大小写转换规律(重要!)
    • 小写字母的 ASCII 码 比对应的大写字母 大 32
    • 公式:ASCII('a') = ASCII('A') + 32
    • 即 $97 = 65 + 32$。
    • 这个 32 很关键,是大小写转换的“密钥”。

四、ASCII 码与字符的相互转换

在 C++ 中,char 类型在内存中实际上就是以 整数 (ASCII 码) 形式存储的。这意味着 charint 可以自由混用(混合运算和赋值)。

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'

五、易错点总结

  1. 混淆 '0'0
    • 0 是整数零,逻辑上的 False,ASCII 码为 0 的字符是 Null (空字符)。
    • '0' 是字符零,显示的符号,ASCII 码是 48
  2. 混淆空格和空字符
    • 空格 (Space) 的 ASCII 是 32,是能打印出来的空白。
    • 空字符 (\0) 的 ASCII 是 0,通常用于标记字符串的结束。
  3. 计算越界
    • 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),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权