原文地址:
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 删除 |