在日常编程和算法练习中,我们经常需要在单个字符(char)和整数(int)之间互相转换。动手写代码前,我们要先分清 2 种不同的需求:一种是 “字符与 ASCII 码互转”,比如 'A' 与 65 互转;另一种是 “数字字符与数值互转”,比如 '8' 与 8 互转。
这两种需求对应的转换写法完全不同。如果我们本来想把字符 '8' 转成整数 8 参与加法运算,却误用了转 ASCII 码的写法,算出来的结果就会变成 56。
字符与 ASCII 码互转
在 C++ 的数据类型中,char 在内存里保存的其实就是整数编号,也就是字符对应的 ASCII 码,比如 'A' 对应 65、'a' 对应 97、'0' 对应 48。
因此,如果我们想在字符和 ASCII 码之间互转,直接使用前面学过的 static_cast 就可以了。
1. char 转 ASCII 码
如果想要获取某个字符对应的 ASCII 码整数,我们可以使用 static_cast<int>() 将 char 显式转换为 int。
语法:
static_cast<int>(字符)说明:
将任意 char 字符或变量传入圆括号后,static_cast<int>() 会返回它在 ASCII 码表中的十进制编号。
示例 1:获取字符的 ASCII 码
#include <iostream>
int main() {
char ch = 'A';
int code = static_cast<int>(ch); // 转为 ASCII 码
std::cout << ch << '\n';
std::cout << code << '\n';
return 0;
}运行结果如下。
A
65分析:
static_cast<int>(ch) 表示取出字符 'A' 在 ASCII 码表中的编号 65,并赋值给整型变量 code。由于 char 转 int 属于从小范围类型向大范围类型的转换,C++ 也支持自动隐式转换。对于这个例子来说,下面 2 种方式是等价的。
// 方式 1(推荐)
int code = static_cast<int>(ch);
// 方式 2
int code = ch;在实际开发中,我们更推荐使用方式 1,这样能让读代码的人一眼看出这里是有意把字符当成整数编号来处理。
2. ASCII 码转 char
反过来,如果我们已知某个 ASCII 码整数,想把它还原成对应的字符,可以使用 static_cast<char>()。
语法:
static_cast<char>(整数)说明:
这里的整数通常处于 0 ~ 127 的标准 ASCII 码范围内。经 static_cast<char>() 转换为 char 类型后,传给 std::cout 就会按照字符形式打印出来。
示例 2:ASCII 码转为字符
#include <iostream>
int main() {
int code = 97;
char ch = static_cast<char>(code); // 转为对应字符
std::cout << code << '\n';
std::cout << ch << '\n';
return 0;
}运行结果如下。
97
a分析:
在 ASCII 码表中,十进制编号 97 对应的是小写字母 'a'。我们通过 static_cast<char>(code) 转换后,变量 ch 保存的就是字符 'a'。
数字字符与整数互转
接下来看日常写代码时更常遇到的第 2 种需求:手里有一个数字字符 '8',希望把它转成真正的整数 8 来参与算术运算。
如果我们直接写 static_cast<int>('8'),得到的是 '8' 的 ASCII 码 56,而不是整数 8。那应该怎么转换呢?其实方法很简单:在 ASCII 码表中,数字字符 '0' 到 '9' 是连续排列的,具体关系如下表所示。
| 数字字符 | ASCII 码 | 与 '0' 的差值 |
|---|---|---|
| '0' | 48 | 48 - 48 = 0 |
| '1' | 49 | 49 - 48 = 1 |
| '2' | 50 | 50 - 48 = 2 |
| '8' | 56 | 56 - 48 = 8 |
| '9' | 57 | 57 - 48 = 9 |
从上表可以看出,任何一个数字字符只要减去字符 '0',两者的 ASCII 码相减后,得到的差值正好就是它代表的数值。这样一来,大家根本不用去记 '0' 的 ASCII 码是 48,直接在代码里和 '0' 做加减运算就可以了。
1. 数字字符转整数
在 C++ 中,想要把 '0' ~ '9' 之间的单个数字字符转成对应的整数 0 ~ 9,我们只需要拿该字符减去字符 '0'。
语法:
数字字符 - '0' 说明:
两个 char 字符相减时会自动提升为 int 整数相减,因此该表达式算出来的结果直接就是 int 类型的整数 0 ~ 9。
示例 3:数字字符转为整数
#include <iostream>
#include <string>
int main() {
char ch = '8';
int num = ch - '0'; // 数字字符转整数
std::cout << num << '\n';
std::cout << num + 2 << '\n';
std::string year = "2026";
int lastDigit = year[3] - '0'; // 提取末位数字
std::cout << lastDigit + 1 << '\n';
return 0;
}运行结果如下。
8
10
7分析:
在这个例子中,ch - '0' 相当于拿 '8' 的 ASCII 码 56 减去 '0' 的 ASCII 码 48,算出来的结果正好是整数 8。这种写法在提取 std::string 中的某一位数字时非常实用,比如 year[3] - '0' 就能把末位字符 '6' 转成整数 6 参与加法运算。
这里小伙伴们要注意,千万不要对数字字符直接使用 static_cast<int>()。下面这种写法就是错误的,因为它拿到的是 ASCII 码 56 而不是数值 8。
char ch = '8';
int wrongNum = static_cast<int>(ch); // 得到 56 而非 8另外,如果字符 ch 来自外部输入,我们不确定它是不是数字字符。此时在转换前可以先加上 if (ch >= '0' && ch <= '9') 判断范围,避免把字母或符号拿去减 '0'。
2. 整数转数字字符
反过来,如果我们想把 0 ~ 9 之间的个位整数转成对应的数字字符 '0' ~ '9',只需要在整数的基础上加上字符 '0',再转回 char 类型即可。
语法:
static_cast<char>(个位整数 + '0')说明:
个位整数与 '0' 相加时,会先算出对应的 int 类型 ASCII 码。把 int 存回范围更小的 char 变量时,外层套上 static_cast<char>() 显式转换更加规范。
示例 4:个位整数转为数字字符
#include <iostream>
#include <string>
int main() {
int num = 8;
// 将个位整数转为数字字符
char ch = static_cast<char>(num + '0');
std::string room = "A-";
room += ch;
std::cout << ch << '\n';
std::cout << room << '\n';
return 0;
}运行结果如下。
8
A-8分析:
在上面代码中,num + '0' 先拿整数 8 加上 '0' 的 ASCII 码 48 算出整数 56,再经 static_cast<char>() 转换为数字字符 '8',最后追加到 \"A-\" 后面。
需要注意的是,加减 '0' 的技巧只适用于单个数字字符与个位整数。如果是像 "128" 这样的多位数字符串与 int 互转,就不能靠加减 '0' 处理了,我们会在下一节 “C++ int 与 string 互转” 中展开介绍。
下面代码中,变量 ch 最终对应的字符是 '5',小伙伴们可以思考一下为什么。
char start = '2';
int step = 3;
char ch = static_cast<char>(start + step);常见问题
1. 为什么执行 std::cout << 'A' + 1; 输出的是数字 66,而不是字符 'B'?
因为在 C++ 的算术运算中,char 类型会自动提升为 int 整数参与计算。'A' + 1 实际上是在计算 65 + 1,整个表达式的结果类型是 int 整数 66。
如果我们希望输出下一个字母 'B',只需要写成 static_cast<char>('A' + 1),把计算结果显式转回 char 类型即可。
2. 把单个字符传给 std::to_string(),为什么转出来的是 ASCII 码数字字符串?
比如对 char ch = 'A'; 调用 std::to_string(ch),得到的结果并不是 "A",而是字符串 "65"。这是因为该函数专门用来把数值转为十进制文本,它会把 ch 当成整数编号 65 来转换。
如果我们想把单个 char 字符真正转成 std::string 字符串,应该写成 std::string s(1, ch);,表示构造一个包含 1 个 ch 字符的字符串。
