原文地址: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 删除
|
转载于:https://blog.51cto.com/vincenttung/1306636