3 ASCII编码与数据类型转换
正在加载视频播放器…
GESP C++ 二级:ASCII 编码与数据类型转换精讲
核心目标:掌握ASCII 编码概念、常见字符编码、字符与整数关系、字符运算、大小写转换、数字字符与数字互转、转义字符;隐式类型转换、显式类型转换、整数与浮点转换、字符与整数转换、布尔与整数转换、转换规则与易错点。
字符本质是 ASCII 码整数;类型转换分自动和强制,转换方向影响结果,转换位置决定精度。
第一部分:ASCII 编码
1. ASCII 是什么
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种字符编码标准,用 0~127 的整数表示常用字符。
- 标准 ASCII:0~127,共 128 个字符。
- 扩展 ASCII:128~255,共 128 个字符。
- 在 C++ 中,
char类型存的就是字符对应的 ASCII 码。
char c = 'A';
cout << (int)c << endl; // 输出 65
2. 关键 ASCII 值(必记)
| 字符 | ASCII | 字符 | ASCII |
|---|---|---|---|
'\0' |
0 | '0' |
48 |
'\n' |
10 | '9' |
57 |
' ' |
32 | 'A' |
65 |
'0' |
48 | 'Z' |
90 |
'9' |
57 | 'a' |
97 |
'A' |
65 | 'z' |
122 |
'Z' |
90 | ||
'a' |
97 | ||
'z' |
122 | ||
规律:
- 数字字符
'0'到'9'连续。 - 大写字母
'A'到'Z'连续。 - 小写字母
'a'到'z'连续。 - 同一字母,小写比大写大 32。
'a' - 'A' = 97 - 65 = 32
3. 字符与整数的关系
char 可以和 int 互相转换:
char c = 'A';
int x = c; // 65
cout << (int)c; // 65
cout << (char)65; // A
字符参与算术运算时,会自动转成整数:
char c = 'A';
cout << c + 1 << endl; // 66
cout << (char)(c + 1) << endl; // B
4. 字符运算常见模型
4.1 字母偏移
char c = 'A';
c = c + 2; // 'C'
cout << c << endl; // C
4.2 数字字符转数字
char c = '7';
int x = c - '0'; // 7
cout << x << endl;
4.3 数字转数字字符
int x = 7;
char c = x + '0'; // '7'
cout << c << endl;
4.4 输出 ASCII 码
char c;
cin >> c;
cout << (int)c << endl;
5. 大小写转换
5.1 小写转大写
char c = 'a';
c = c - 'a' + 'A'; // 'A'
// 或 c = c - 32;
5.2 大写转小写
char c = 'A';
c = c - 'A' + 'a'; // 'a'
// 或 c = c + 32;
5.3 使用函数(了解)
需要头文件:
#include <cctype>
c = toupper(c); // 小写转大写
c = tolower(c); // 大写转小写
注意:只对字母有效,非字母不变。
6. 转义字符
| 转义字符 | 含义 | ASCII |
|---|---|---|
'\n' |
换行 | 10 |
'\t' |
制表符 | 9 |
'\\' |
反斜杠 | 92 |
'\'' |
单引号 | 39 |
'\"' |
双引号 | 34 |
'\0' |
空字符 | 0 |
示例:
cout << "A\tB" << endl; // A B
cout << "A\nB" << endl; // A 换行 B
7. 字符输入输出注意
char c;
cin >> c; // 跳过空格、换行、制表符
cin.get(c); // 读取任意一个字符,包括空格和换行
8. ASCII 常见题型与易错点
题型:
- 给出字符,输出 ASCII 码。
- 给出 ASCII 码,输出字符。
- 字符加密:每个字符加一个偏移量。
- 大小写转换。
- 数字字符与数字互转。
- 判断字符类型。
易错点:
'0'是字符,ASCII 48;0是整数。'A'和"A"不同:单引号字符,双引号字符串。- 数字字符转数字要减
'0',不是直接赋值。 - 大小写差 32,小写比大写大。
cin >> c会跳过空格,读空格用cin.get(c)。- 字符运算结果默认是整数,输出字符要
(char)转换。
第二部分:数据类型转换
9. 为什么需要类型转换
不同类型的数据运算时,计算机需要统一类型。C++ 提供两种转换:
| 转换方式 | 特点 | 示例 |
|---|---|---|
| 隐式转换 | 自动完成,不需要写转换符号 | double x = 5; |
| 显式转换 | 手动强制转换 | (double)5 / 2 |
10. 隐式类型转换(自动转换)
10.1 小类型转大类型
int a = 5;
double b = a; // 5 变成 5.0
常见转换方向:
char → int → long long → float → double
bool → int
10.2 混合运算自动提升
int a = 5;
double b = 2.5;
cout << a + b << endl; // 7.5,a 自动转 double
规则:低精度类型向高精度类型转换。
10.3 赋值时右边转左边
int a = 3.9; // a = 3,小数被截断
double b = 5; // b = 5.0
11. 显式类型转换(强制转换)
语法:
(类型)表达式
示例:
int a = 5, b = 2;
double c = (double)a / b; // 2.5
也可以:
double d = (double)(a / b); // 2.0
关键:转换位置不同,结果不同。
(double)a / b; // 先把 a 转 double,再除,结果 2.5
(double)(a / b); // 先整数除得 2,再转 double,结果 2.0
12. 常见转换场景
12.1 整数转浮点
int a = 5;
double b = (double)a; // 5.0
12.2 浮点转整数
double x = 3.9;
int n = (int)x; // 3,截断,不是四舍五入
负数:
double y = -3.9;
int m = (int)y; // -3
12.3 字符与整数
char c = 'A';
int x = (int)c; // 65
char d = (char)65; // 'A'
12.4 布尔与整数
bool flag = true;
int x = flag; // 1
bool b = 5; // true
bool c = 0; // false
13. 整数除法与浮点除法
这是二级高频易错点。
cout << 5 / 2 << endl; // 2
cout << 5.0 / 2 << endl; // 2.5
cout << 5 / 2.0 << endl; // 2.5
cout << (double)5 / 2 << endl; // 2.5
cout << 1.0 * 5 / 2 << endl; // 2.5
| 表达式 | 结果 | 说明 |
|---|---|---|
5 / 2 |
2 | 整数除法 |
5.0 / 2 |
2.5 | 浮点除法 |
(double)5 / 2 |
先转 double | |
(double)(5 / 2) |
2.0 | 先整数除,再转 double |
1.0 * 5 / 2 |
2.5 | 常用技巧 |
14. 类型提升规则(了解)
当不同类型混合运算时,按以下顺序提升:
bool → char → int → long long → float → double
例如:
int a = 3;
char c = 'A';
cout << a + c << endl; // 68,c 转 int
15. 溢出与截断
15.1 溢出
int a = 100000;
int b = 100000;
int c = a * b; // 可能溢出
long long d = 1LL * a * b; // 正确
15.2 截断
int a = 3.9; // 3
int b = 3.1; // 3
int c = -3.9; // -3
16. 数据类型转换常见题型与易错点
题型:
- 阅读程序写结果:表达式类型转换后输出什么。
- 判断表达式结果类型。
- 整数除法与浮点除法。
- 强制转换位置。
- 字符与整数转换。
- 溢出判断。
易错点:
- 浮点转整数是截断,不是四舍五入。
- 两个整数相除结果一定是整数。
(double)(a / b)和(double)a / b结果不同。int溢出不会报错,但结果错误。char与int转换时忘记 ASCII。'0'不是 0,是 48。bool输出默认是 1/0,不是 true/false。- 强制转换只影响当前表达式,不改变变量本身类型。
第三部分:综合应用与速查
17. 综合示例
示例 1:字符加密
char c;
cin >> c;
c = c + 3; // 每个字符后移 3 位
cout << c << endl;
输入 A,输出 D。
示例 2:数字字符转数字并求和
char c1, c2;
cin >> c1 >> c2;
int sum = (c1 - '0') + (c2 - '0');
cout << sum << endl;
输入 3 5,输出 8。
示例 3:大小写转换
char c;
cin >> c;
if (c >= 'a' && c <= 'z') {
c = c - 32;
}
cout << c << endl;
输入 b,输出 B。
示例 4:整数除法与浮点除法
int a = 7, b = 2;
cout << a / b << endl; // 3
cout << (double)a / b << endl; // 3.5
cout << (double)(a / b) << endl; // 3
18. 速查表
| 需求 | 写法 |
|---|---|
| 字符转 ASCII | (int)c |
| ASCII 转字符 | (char)x |
| 数字字符转数字 | c - '0' |
| 数字转数字字符 | x + '0' |
| 小写转大写 | c - 32 或 c - 'a' + 'A' |
| 大写转小写 | c + 32 或 c - 'A' + 'a' |
| 字符是否数字 | c >= '0' && c <= '9' |
| 字符是否大写 | c >= 'A' && c <= 'Z' |
| 字符是否小写 | c >= 'a' && c <= 'z' |
| 隐式转换 | double x = 5; |
| 显式转换 | (double)a / b |
| 浮点转整数 | (int)x |
| 整数转浮点 | (double)a |
| 布尔转整数 | int x = true; |
| 整数转布尔 | bool b = 5; |
19. 总结
ASCII 与类型转换是二级考试的核心基础。
- 字符本质是 ASCII 码整数。
'0'是 48,'A'是 65,'a'是 97。- 小写字母比大写字母大 32。
- 数字字符转数字要减
'0'。 - 数字转数字字符要加
'0'。 - 字符参与运算会自动转整数,输出字符要
(char)。 - 隐式转换自动发生,显式转换用
(类型)。 - 浮点转整数是截断,不是四舍五入。
- 两个整数相除结果是整数,要小数就转浮点。
- 转换位置决定结果,括号很重要。
复习建议:多练“阅读程序写结果”和“字符运算”两类题,重点注意 ASCII 值、大小写差 32、数字字符转换、强制转换位置、整数除法与浮点除法。考试中先判断参与运算的类型,再确定转换方向,最后按格式输出。