原文地址:http://www.dz3w.com/mcu/clanguage/2477.html

C语言基本类型:字符型(Char)用法介绍

1.字符型(Char)简介
字符型Char)用于储存字符(Character),如英文字母或标点。严格来说,Char 其实也是整数类型(Integer Type),因为 Char 类型储存的实际上是整数,而不是字符。计算机使用特定的整数编码来表示特定的字符。美国普遍使用的编码是ASCII(American Standard Code For Information Interchange 美国信息交换标准编码)。例如:ASCII 使用 65 来代表大写字母 A,因此存储字母 A 实际上存储的是整数65。注意:许多IBM大型机使用另一种编码——EBCDIC(Extended Binary-Coded Decimal Interchange Code 扩充的二进制编码的十进制交换码);不同国家的计算机使用的编码可能完全不同。
ASCII 的范围是 0 到 127,故而 7 位(Bit)就足以表示全部 ASCII。Char 一般占用 8 位内存单元,表示ASCII绰绰有余。许多系统都提供扩展ASCII(Extended ASCII),并且所需空间仍然在 8 位以内。注意,不同的系统提供的扩展 ASCII 的编码方式可能有所不同!
许多字符集超出了 8 位所能表示的范围(例如汉字字符集),使用这种字符集作为基本字符集的系统中,Char 可能是 16 位的,甚至可能是 32 位的。总之,C 保证 Char 占用空间的大小足以储存系统所用的基本字符集的编码。C 语言定义一个字节(Byte)的位数为 Char 的位数,所以一个字节可能是 16 位,也可能是 32 位,而不仅仅限于 8 位。
2. 声明字符型变量
字符型变量的声明方式和其它类型变量的声明方式一样:
Char Good;
Char Better, Best;
以上代码声明了三个字符型变量:Good、Better,和 Best。
3. 字符常量与初始化
我们可以使用以下语句来初始化字符型变量:
Char Ch = 'A';
这个语句把 Ch 的值初始化为 A 的编码值。在这个语句中,'A' 是字符常量。C 语言中,使用单引号把字符引起来就构成字符常量。我们来看另外一个例子:
Char Fail; /* 声明一个字符型变量 */
Fail = 'F'; /* 正确 */
Fail = "F"; /* 错!"F" 是字符串字面量 */
把字符用双引号引起来构成字符串字面量,所以第三个语句是错误的。我们会在后续的教程中讨论字符串,现在暂且把它放下。
因为字符实质上是以数字的形式存储的,所以我们可以直接使用数字来初始化字符变量,或者给字符变量赋值:
Char Ch = 65; /* 不好的风格 */
在 ASCII 中,A 的编码是 65,所以对于使用 ASCII 的系统来说,这个语句等同于 Char Ch = 'A';。使用非 ASCII 的系统中,65 代表的不一定是 A,而有可能是其它任何字符,所以使用数字来初始化字符变量,或者给字符变量赋值是一种不好的风格,因为移植性太差了!但是,使用字符常量(例如 'A')来初始化字符变量,或者给字符变量赋值,字符变量得到的一定是我们所期待的字符的编码值。例如:
Char Ch = 'A';
无论在使用任何编码的系统中,Ch 都能够得到字符 A 所对应的编码值。这是因为编译器会自动把 'A' 转化成 A 所对应的编码值。因此,我们应该使用字符常量来初始化字符变量,或者给字符变量赋值;而不要用数字。
有趣的是,C 使用 Int 类型来处理字符常量,而不是 Char 类型。例如,在使用32位 Int 的ASCII 系统中,以下代码
Char Ch = 'C';
'C' 的编码值 67 被存储于 32 位的内存单元中;不过 Ch 仍然存储于 8 位的内存单元中,只是它的值变成了 67。因此,我们可以定义形如 'Good' 的古怪字符常量。因为每个字符的编码值占用 8 位的内存单元,所以这个常量刚好可以存储于 32 位的内存单元。然而,用这种字符常量初始化字符变量,或者给字符变量赋值的话,导致的结果是,字符变量只能得到字符常量的最后 8 位。也就是说,以下代码
Char Ch = 'Good';
Ch 得到的是 'D' 的值。

ASCII值

控制字符
ASCII值
控制字符
ASCII值
控制字符
ASCII值
控制字符
0
NUL
32
(Space)
64
@
96
`
1
SOH
33
!
65
A
97
A
2
STX
34
"
66
B
98
B
3
ETX
35
#
67
C
99
C
4
EOT
36
$
68
D
100
D
5
ENQ
37
%
69
E
101
E
6
ACK
38
&
70
F
102
F
7
BEL
39
'
71
G
103
G
8
BS
40
(
72
H
104
H
9
HT
41
)
73
I
105
I
10
LF
42
*
74
J
106
J
11
VT
43
+
75
K
107
K
12
FF
44
,
76
L
108
L
13
CR
45
-
77
M
109
M
14
SO
46
.
78
N
110
N
15
SI
47
/
79
O
111
O
16
DLE
48
0
80
P
112
P
17
DC1
49
1
81
Q
113
Q
18
DC2
50
2
82
R
114
R
19
DC3
51
3
83
S
115
S
20
DC4
52
4
84
T
116
T
21
NAK
53
5
85
U
117
U
22
SYN
54
6
86
V
118
V
23
ETB
55
7
87
W
119
W
24
CAN
56
8
88
X
120
X
25
EM
57
9
89
Y
121
Y
26
SUB
58
:
90
Z
122
Z
27
ESC
59
;
91
[
123
{
28
FS
60
<
92

124
|
29
GS
61
=
93
]
125
}
30
RS
62
>
94
^
126
~
31
US
63
?
95
_
127
DEL

NUL 空字符
VT 垂直制表
SYN 同步
SOH 标题开始
FF 走纸控制
ETB 信息组传送结束
STX 正文开始
CR 回车
CAN 作废
ETX 正文结束
SO 移位输出
EM 媒介结束 End Of Medium
EOT 传输结束
SI 移位输入
SUB 换置
ENQ 询问字符
DLE Data Link Escape
ESC Escape
ACK 确认
DC1 设备控制1
FS 文件分隔符
BEL 响铃
DC2 设备控制2
GS 组分隔符
BS 退格
DC3 设备控制3
RS 记录分隔符
HT 横向制表
DC4 设备控制4
US 单元分隔符
LF 换行
NAK 否定
DEL 删除