char 类型基础与双重性
char 类型是所有数据类型中占用内存空间最少的,通常只占 1 个字节(8位)。它既可以存储字符,也可以存储小整数,具有双重性。
1. 取值范围与底层存储
1 个字节(8位二进制)的范围是 0000 0000 到 1111 1111。char 是否有符号取决于编译器实现:
- 无符号
unsigned char:8位全为数据位,范围 0 ~ 255(0000 0000~1111 1111)。 - 带符号
signed char:最高位为符号位,范围 -128 ~ 127(1000 0000为 -128,0000 0000为 0,0111 1111为 127,1111 1111为 -1)。
2. 字符表示与 ASCII 码
字符用单引号括起来(如 'A'、'9'、'!')。底层存储依赖 ASCII 码映射:
'A'对应整数 65'9'对应整数 57(注意:字符'9'不等于数字 9,数字 9 的 ASCII 是控制字符,字符'9'是符号)'!'对应整数 33- 特殊字符使用转义序列:
'\n'(换行)、'\t'(制表符)、'\''(单引号)
3. 双重性:字符与整数的互转
char 本质是存整数,输出格式决定了解析方式:
printf("%d", letter):按整数输出(打印 ASCII 码值)。printf("%c", letter):按字符输出(打印对应符号)。
代码运行解析:
#include <stdio.h>
int main(void)
{
char letter = 'A'; // 'A' 的 ASCII 为 65
printf("%d\n",letter); // 输出 65
char digit = '9'; // 字符 '9' 的 ASCII 为 57
printf("%d\n",digit); // 输出 57
char exclamation = '!'; // '!' 的 ASCII 为 33
printf("%d\n",exclamation); // 输出 33
char c = 78; // 78 对应字符 'N'
printf("%c\n",c); // 输出 N
printf("%c\n",65); // 65 对应 'A',输出 A
printf("%c\n",letter+1); // letter(65)+1=66 对应 'B',输出 B
return 0;
}Code language: PHP (php)
输出结果对照(与截图完全一致):
65
57
33
N
A
B
4. 运算与整型提升
char 参与运算时,会先发生整型提升为 int 类型,计算后再赋值回去:
char letter = 'C'; // 67
letter = letter + 3; // 67+3=70,对应字符 'F'Code language: JavaScript (javascript)
若运算结果超过 char 范围(如 128 存入带符号 char),会发生截断/溢出,变成负数。
5. 注意
| 特性 | 说明 |
|---|---|
| 存储大小 | 固定 1 字节(sizeof(char) == 1) |
| 默认符号 | 取决于编译器(常见为带符号 signed char) |
| 字符字面量 | 单引号 'A',多字符或字符串用双引号 "A" |
| 整数溢出 | 存大整数会截断,建议明确用 signed/unsigned char |
| 格式符 | %c 输出字符,%d 输出整数 ASCII 码 |
Previous: 赋值语句中的隐式类型转换
Next: 字符的输入输出