考纲要求
- 知道 ASCII 用 7 位二进制为常用字符编号,共可表示 128 个字符,包括英文字母、数字、标点和控制字符。
- 记住关键码值:数字字符 '0' 到 '9' 的码值连续递增,'0' 是 48;大写字母 'A' 是 65,小写字母 'a' 是 97。
- 能根据相邻关系推出其他字符的码值,例如 'B' 是 66,'1' 是 49。
- 理解字符 '0' 与整数 0 不是同一个值,前者在内存中保存的是编码 48。
典型题型
- 给出字符,要求写出它的 ASCII 码值;或给出码值,要求写出对应字符。
- 比较字符或字符串的大小,并说明比较依据。
- 统计字符串中某类字符,或把字符数字转换成对应整数。
常见错误
- 把字符 '0' 与数值 0 看成同一个东西。'0' 的编码是 48,直接参与数值运算得到的是 48 而不是 0。
- 以为大写字母和小写字母的码值相邻。'Z' 是 90,'a' 是 97,中间还隔着若干符号。
- 把字符串 "12" 直接当成整数 12 参与运算。字符串是两个字符,转成整数需要减去 '0' 或使用转换函数。
- 忘记空格也有编码 32,比较字符串时把空格当成空字符串处理。
深入理解
128 个字符,7 位就够
ASCII 用 7 位二进制为字符编号,编号范围 0 到 127,共 128 个字符,包括 26 个大写字母、26 个小写字母、10 个数字、常用标点和一批控制字符。7 位而不是 8 位是常考点:8 位能表示 256 种,但 ASCII 只用了一半,第 8 位在早期的传输中常被用作校验位。
需要死记的只有三个锚点:'0' 是 48,'A' 是 65,'a' 是 97。其余全部靠「连续」推出来——数字字符从 '0' 开始连续递增,所以 '1' 是 49、'9' 是 57;大写字母从 'A' 到 'Z' 连续,是 65 到 90;小写字母从 'a' 到 'z' 是 97 到 122。
大小写之间差 32
同一字母的大写和小写码值正好相差 32,例如 'a' - 'A' = 97 - 65 = 32。这个常数有两个用途:一是推算未知字符的码值,已知 'C' 是 67,要求 'c',加 32 得 99;二是做大小写转换,c - 32 变大写,c + 32 变小写。
注意 32 不是随便来的:二进制里大写和小写只差第 6 位(从 0 开始数),翻转这一位就能切换大小写。题目若给出 'G' 求 'g',直接 71 + 32 = 103,不需要背表。
字符 '0' 和数字 0 完全不是一回事
'0' 是字符,内存里存的是 48;0 是整数,内存里存的就是 0。写 int x = '0'; 后 x 的值是 48,不是 0。反过来把数字字符转成数值,必须写 x - '0',直接用 (int)c 只会得到它的编码。
同理,cout << 'A' + 1 输出的是 66 而不是 B,因为加法把类型提升成了 int;要输出字符必须再转回来:cout << (char)('A' + 1)。这一组转换是二级最容易失分的地方,判断题里问「字符可以直接参与算术运算吗」,答案是能,但结果变成整数。
自编例题
由 'A' 推出其他字符
已知 'A' 的 ASCII 码是 65,求 'C' 和 'a' 的码值,并说明字符比较大小的依据。
cout << (int)'A' << ' ' << (int)'C' << ' ' << (int)'a' << endl;
// 输出:65 67 97大写字母按字母顺序连续编码,'C' 比 'A' 后两位,码值是 67。'a' 的码值是 97,比 'A' 大 32,所以同一字母的小写形式码值更大。字符比较大小比较的是码值,'Z' 的 90 小于 'a' 的 97,说明按 ASCII 排序时全部大写字母都排在小写字母之前。把字符数字转成整数时,用 c - '0' 就能得到 0 到 9 的真实数值。
相关真题
这块内容在整条路线里的位置:GESP C++ 2 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
ASCII 能表示中文吗?
标准 ASCII 只覆盖 128 个字符,不能表示中文。中文通常使用 Unicode 或 GBK 等编码,一个汉字往往占多个字节。
为什么 '0' 的码值是 48?
这是 ASCII 标准的规定。数字字符 '0' 到 '9' 连续编码为 48 到 57,记住 '0' 是 48 就能推出全部数字。
字符和整数能直接相加吗?
可以,字符会先转换成它的编码值再参与运算。例如 'A' + 1 得到 66,转回字符就是 'B',但要注意结果的范围。
