在 C 语言中,将 char 类型转换为 int 类型是一个常见操作,但需要理解其背后的原理,因为 char 在 C 中本质上是一种小范围的整数类型。

转换主要分为两种情况:
- 将
char字符(如 'A', '5')转换为其对应的 ASCII 码整数值。 - 将一个表示数字的
char(如 '5')转换为其真正的整数值(即 5)。
下面我们详细讲解这两种情况,并提供多种方法。
核心概念:char 就是整数
最重要的一点是:在 C 语言中,char 类型本质上是 1 字节的整数类型,它用来存储字符,但计算机内部存储的实际上是该字符对应的ASCII 码值(或其他编码如 Unicode)。
- 字符
'A'的 ASCII 码是 65,一个存储'A'的char变量,其内存中实际存放的值就是 65。 - 字符
'0'的 ASCII 码是 48。char c = '0';等价于char c = 48;。
这个特性是所有转换方法的基础。

将 char 字符转为 ASCII 码整数值
这是最简单的转换,因为赋值操作本身就会完成这个转换。
方法 1:直接赋值(隐式类型转换)
这是最直接、最常用的方法,当你将一个 char 变量赋值给一个 int 变量时,C 编译器会自动将 char 的值(ASCII 码)提升为 int 类型。
示例代码:
#include <stdio.h>
int main() {
char ch1 = 'A';
char ch2 = 'a';
char ch3 = '0';
char ch4 = '$';
// 直接将 char 赋值给 int
int int1 = ch1;
int int2 = ch2;
int int3 = ch3;
int int4 = ch4;
printf("字符 '%c' 的 ASCII 码是: %d\n", ch1, int1); // 输出: 字符 'A' 的 ASCII 码是: 65
printf("字符 '%c' 的 ASCII 码是: %d\n", ch2, int2); // 输出: 字符 'a' 的 ASCII 码是: 97
printf("字符 '%c' 的 ASCII 码是: %d\n", ch3, int3); // 输出: 字符 '0' 的 ASCII 码是: 48
printf("字符 '%c' 的 ASCII 码是: %d\n", ch4, int4); // 输出: 字符 '$' 的 ASCII 码是: 36
return 0;
}
说明:
int int1 = ch1; 这行代码中,ch1 的值('A' 对应的 65)被隐式地转换为了 int 类型并赋值给 int1。int1 的最终值就是 65。

将数字字符(如 '5')转为整数值(如 5)
这是更常见的场景,比如处理用户输入的数字字符串 "123",需要将其转换为整数 123。
方法 1:利用 ASCII 码差值(经典方法)
这种方法基于一个事实:所有数字字符('0' 到 '9')的 ASCII 码是连续的。'0' 是 48,'1' 是 49,...,'9' 是 57。
任何一个数字字符减去 '0',就能得到它对应的整数值。
示例代码:
#include <stdio.h>
int main() {
char ch = '5'; // 这是一个字符,存储的是 ASCII 码 53
// '5' 的 ASCII 码是 53, '0' 的 ASCII 码是 48
// 53 - 48 = 5
int num = ch - '0';
printf("字符 '%c' 转换为整数是: %d\n", ch, num); // 输出: 字符 '5' 转换为整数是: 5
return 0;
}
优点:
- 效率高,是底层运算。
- 不需要包含任何头文件。
缺点:
ch不是数字字符('A' 或 '$'),结果将是无意义的。
方法 2:使用标准库函数 atoi()
atoi (ASCII to Integer) 是 C 标准库 <stdlib.h> 中的一个函数,专门用于将字符串转换为 int 类型,它也可以处理单个字符。
示例代码:
#include <stdio.h>
#include <stdlib.h> // 必须包含这个头文件
int main() {
char ch = '7';
char str[] = "123"; // 也可以处理字符串
// 使用 atoi 函数
int num_from_char = atoi(&ch); // 需要传入字符的地址
int num_from_str = atoi(str);
printf("字符 '%c' 使用 atoi 转换为整数是: %d\n", ch, num_from_char); // 输出: 字符 '7' 使用 atoi 转换为整数是: 7
printf("字符串 \"%s\" 使用 atoi 转换为整数是: %d\n", str, num_from_str); // 输出: 字符串 "123" 使用 atoi 转换为整数是: 123
return 0;
}
说明:
atoi会跳过字符串开头的空白字符,然后遇到第一个非数字字符时停止转换。- 如果转换失败(例如字符串开头就不是数字),
atoi会返回 0。 - 注意:
atoi无法检测转换错误("abc"会返回 0,但你无法区分这是转换失败还是原字符串就是"0"),更现代、更安全的选择是strtol。
方法 3:使用标准库函数 strtol()
strtol (string to long) 是比 atoi 更强大、更安全的函数,它定义在 <stdlib.h> 中,它可以检测转换错误,并且能处理更大的数值范围(long 类型)。
示例代码:
#include <stdio.h>
#include <stdlib.h> // 必须包含
#include <errno.h> // 用于检查 errno
int main() {
char ch = '9';
char str[] = "456";
char invalid_str[] = "abc";
long num;
char *endptr; // 用于存储转换停止的位置
// 转换单个字符
errno = 0; // 在调用前重置 errno
num = strtol(&ch, &endptr, 10);
if (errno == 0 && *endptr == '\0') {
printf("字符 '%c' 使用 strtol 转换为整数是: %ld\n", ch, num);
} else {
printf("转换失败!\n");
}
// 转换字符串
errno = 0;
num = strtol(str, &endptr, 10);
if (errno == 0 && *endptr == '\0') {
printf("字符串 \"%s\" 使用 strtol 转换为整数是: %ld\n", str, num);
} else {
printf("转换失败!\n");
}
// 转换无效字符串
errno = 0;
num = strtol(invalid_str, &endptr, 10);
if (errno == 0 && *endptr == invalid_str) { // *endptr 指向字符串开头,说明一个字符都没转换
printf("字符串 \"%s\" 转换为整数是: %ld (可能原字符串就是0)\n", invalid_str, num);
} else {
printf("字符串 \"%s\" 转换失败!\n", invalid_str);
}
return 0;
}
说明:
strtol会将结果存储在long类型中。endptr指针会指向转换过程中停止的位置,如果成功转换整个字符串,*endptr应该指向字符串的结尾'\0'。errno会在发生溢出等错误时被设置为ERANGE。- 优点: 安全、功能强大,能处理错误。
- 缺点: 比
atoi和手动减法更复杂。
总结与对比
| 方法 | 适用场景 | 优点 | 缺点 | 所需头文件 |
|---|---|---|---|---|
| 直接赋值 | 将字符(如 'A')转为 ASCII 码值 | 简单、高效、直观 | 无法将 '5' 转为 5 | 无 |
ch - '0' |
将单个数字字符(如 '5')转为整数 | 高效、底层、无需函数 | 不安全,非数字字符会产生错误结果 | 无 |
atoi() |
将字符串或数字字符转为 int |
使用简单,标准库函数 | 不安全,无法检测错误(如 "abc") | <stdlib.h> |
strtol() |
将字符串转为 long,需要严格错误处理 |
最安全,功能强大,能检测错误 | 代码稍复杂,返回 long 类型 |
<stdlib.h>, <errno.h> |
最佳实践建议
-
如果只是想获取字符的 ASCII 码:使用直接赋值,这是最清晰、最直接的方式。
char c = 'Z'; int ascii_val = c; // ascii_val 的值就是 90
-
如果你明确知道输入是单个数字字符,并且追求效率:使用
ch - '0'。char c = '8'; int num = c - '0'; // num 的值就是 8
-
如果是在处理用户输入的字符串(例如从
fgets读取的一行),并且需要健壮的错误处理:首选strtol,它能让你知道转换是否真的成功。char input[100]; fgets(input, sizeof(input), stdin); long num = strtol(input, NULL, 10); // 检查 num 是否有效...
-
如果只是快速转换一个字符串,且不关心错误处理:可以使用
atoi,但要清楚它的局限性。char str[] = "42"; int num = atoi(str); // num 的值是 42
