最安全、最快且符合C++语义的char转数字方式是c - '0',因其利用ASCII数字连续性得到实际数值;直接赋值或强制转换会得到ASCII码值(如'5'→53);处理前须用std::isdigit或范围判断确保字符合法。

直接用 char 减去 '0' 是最安全、最快、也最符合 C++ 语义的转换方式,前提是确定该 char 确实是 ASCII 数字字符('0' 到 '9')。
为什么不能直接赋值或强制类型转换?
因为 char 到 int 的隐式转换是按 ASCII 码值进行的,比如 '5' 的 ASCII 值是 53,不是 5。直接写 int x = c; 得到的是码值,不是数字含义。
-
char c = '7'; int x = c;→x是 55,不是 7 -
int x = (int)c;或int x = static_cast效果一样,仍是 ASCII 值(c); - 只有
c - '0'利用了 ASCII 中数字字符连续排列的特性('0'是 48,'1'是 49…),才真正得到“字符代表的数值”
如何安全处理非数字字符?
生产代码中不能假设输入一定合法。需先判断再转换,否则越界行为未定义。
- 用
std::isdigit(c)(需)检查是否为数字字符 - 或者手动比较:
if (c >= '0' && c - 不推荐用
std::stoi或std::stringstream处理单个char——开销大、异常重、纯属杀鸡用牛刀
示例:
立即学习“C++免费学习笔记(深入)”;
char c = '3';
if (c >= '0' && c <= '9') {
int digit = c - '0'; // 安全,digit == 3
}多个字符组成的数字字符串怎么办?
这是常见误解点:标题说“char 转 int”,但有人实际想转的是像 "123" 这样的 const char*。这已不属于单字符转换范畴,而是字符串解析。
- 单个
char→ 用c - '0' - C 风格字符串(如
"42")→ 用std::atoi、std::strtol或更安全的std::from_chars(C++17) -
std::string→ 推荐std::stoi(注意异常)或std::from_chars(无异常、零分配) - 别对单字符反复调用
std::stoi(&c)——它期待以'\0'结尾的字符串,传入单个char地址极易越界读
最易被忽略的是:ASCII 假设只在绝大多数现代系统成立;若目标平台用 EBCDIC(极少见),'0' 到 '9' 不连续,此时 c - '0' 会出错。不过实际开发中几乎不用考虑这点,标准库和编译器本身都依赖 ASCII 兼容编码。











