- 获取字符的ASCII(或Unicode)码值:将字符
'A'转换为其整数编码65。 - 获取字符本身的数字值:将字符
'5'转换为其整数5。
下面我将详细介绍这两种情况,并提供多种实现方法。

获取字符的ASCII码值(字符 -> 整数编码)
这是最直接、最常见的情况,在C语言中,char 本质上是一种小整型,它存储的是字符的编码值(如ASCII码),当你把一个 char 赋值给一个 int 时,编译器会自动进行整型提升,直接得到其对应的整数值。
方法1:直接赋值(最常用、最推荐)
这是最简单、最符合C语言习惯的方法,C标准规定,char 可以被安全地转换为 int。
#include <stdio.h>
int main() {
char ch = 'A';
int ascii_value;
// 直接赋值,进行隐式类型转换
ascii_value = ch;
printf("字符: %c\n", ch);
printf("对应的ASCII码: %d\n", ascii_value); // 输出: 65
char ch2 = 'a';
ascii_value = ch2;
printf("字符: %c\n", ch2);
printf("对应的ASCII码: %d\n", ascii_value); // 输出: 97
return 0;
}
工作原理:
char 类型在内存中存储的是 65(对于 'A'),当 ch 的值被赋给 ascii_value 时,这个二进制值 65 被原封不动地复制到了 int 类型的变量中。
方法2:使用强制类型转换(显式转换)
虽然直接赋值已经足够,但你也可以使用强制类型转换来明确表达你的意图,这在代码中可以起到强调作用,有时也能避免编译器在某些严格模式下的警告。

#include <stdio.h>
int main() {
char ch = 'B';
int ascii_value;
// 使用强制类型转换
ascii_value = (int)ch;
printf("字符: %c\n", ch);
printf("对应的ASCII码: %d\n", ascii_value); // 输出: 66
return 0;
}
在这个例子中,(int)ch 的结果和方法1是完全一样的。
获取字符的数字值(字符 '5' -> 整数 5)
这种情况是当你有一个代表数字的字符(比如从用户输入或文件中读取的),你希望把它转换成真正的整数进行数学运算。
方法1:减去字符 '0'(最经典、最高效的方法)
这是C语言中最经典、最常用的技巧,它利用了ASCII码中数字字符是连续排列的特性('0'是48, '1'是49, ..., '9'是57)。
#include <stdio.h>
int main() {
char digit_char = '5';
int number_value;
// 减去 '0' 的ASCII码值,得到数字本身
number_value = digit_char - '0';
printf("字符: %c\n", digit_char);
printf("转换后的数字: %d\n", number_value); // 输出: 5
return 0;
}
工作原理:

digit_char的值是'5',其ASCII码是53。'0'的ASCII码是48。digit_char - '0'在计算时,实际上是53 - 48,结果就是5,这个结果5被赋值给int类型的number_value。
方法2:使用 atoi() 函数(适用于字符串)
如果你的数字字符可能不止一位(比如字符串 "123"),并且你希望转换成一个整数,那么应该使用标准库函数 atoi() (ASCII to Integer),注意,atoi 的参数是 char*(字符串),而不是单个 char。
#include <stdio.h>
#include <stdlib.h> // 必须包含 stdlib.h 才能使用 atoi
int main() {
char single_digit_char = '7';
char number_str[] = "123"; // 注意,这是一个字符串
// 对于单个字符,方法1更直接
int num1 = single_digit_char - '0';
printf("单个字符 '%c' 转换为数字: %d\n", single_digit_char, num1);
// 对于字符串,使用 atoi
int num2 = atoi(number_str);
printf("字符串 \"%s\" 转换为数字: %d\n", number_str, num2);
return 0;
}
注意:
atoi不会进行错误检查,如果字符串内容不是有效的数字(如"abc"),其行为是未定义的。- 对于更健壮的数字转换,推荐使用
strtol()函数。
总结与最佳实践
| 你的目标 | 推荐方法 | 示例代码 | 说明 |
|---|---|---|---|
| 获取字符的ASCII码 | 直接赋值 | int val = 'A'; |
最简单、最直接、性能最好。 |
| 获取单个字符的数字值 | 减去 '0' | int num = '5' - '0'; |
经典技巧,高效且专为单个数字字符设计。 |
| 将字符串转换为整数 | 使用 atoi() |
int num = atoi("123"); |
适用于处理包含多个数字的字符串。 |
重要提示:signed char vs unsigned char
char 类型本身是 signed 还是 unsigned 是由编译器决定的,为了确保代码的可移植性,如果你关心字符的符号(处理文件流中的 EOF,通常是 -1),最好明确使用 signed char 或 unsigned char。
char ch = -1; // 在某些编译器上,ch可能是255(unsigned),某些是-1(signed) // 为了明确,可以这样写: signed char sch = -1; // sch 一定是 -1 unsigned char uch = 255; // uch 一定是 255
在将 char 转换为 int 时,char 是 signed 的并且是负数,进行整型提升时会进行符号扩展,这在某些情况下需要注意,但对于获取ASCII码这种非负数场景,通常无需担心。
