
5.5 字符型数据支持的操作
字符在程序内部也使用整数来表示,因此,凡是能够施加在整数上的操作都可以施加在字符上。然而,在这些操作中,只有一部分能够产生有意义的结果,这指的就是加法型的操作(也叫作加性操作,具体来说,就是算术加法与算术减法)。两个字符值相乘或相除虽然不违背C语言的语法,但这种结果是没有实际意义的。在涉及char的加法与减法操作里面,比较有用的是下面这三种:
□把两个char值相减的结果当作int值使用。
□把char值与int值相加的结果当作char值使用。
□把char值与int值相减的结果当作char值使用。
大家要注意,char类型只是一个无符号的字节,因此,如果加法或减法的结果超出了0至255的范围,那么就会产生意外的结果,因为权重较高的某些二进制位会被截掉[1]。
有一种需求经常促使我们对字符做加减法,这就是大小写转换。大写字符(大写字母)加上32就可以转换成小写。小写字符(小写字母)减去32就可以转换成大写。下面这个convertUpperLower.c程序就演示了如何在大写与小写之间转换:

从小写字母'b'中减去32就得到大写字母'B',给大写字母'M'加上32就得到小写字母'm'。我们会在第15章详细讲解与字符有关的问题。
在编辑器里新建一个名叫的convertUpperLower.c文件,并录入上述代码。然后编译程序并在终端窗口运行。我们会看到类似下面这样的输出。

还有一种需求经常促使我们在两个字符之间相减,这就是把数位(也就是'0'~'9'这十种字符)转换成它所对应的实际数值(也就是0~9)。字符'0'的值在计算机里是用某个整数来表示的,但这个整数并不是0本身。为了把该字符转换成零值,我们只需要从中减去'0'就可以了(其他9个数位也是这样,只要跟'0'相减,就能得出该数位所对应的字符与'0'这个字符之间的差距,从而实现转换)。下面这个convertDigitToInt.c范例程序便演示了这种用法:

如果直接把两个数位所对应的那两个字符加起来,那么很可能出现奇怪的结果。但如果先把这两个数位分别转换成实际的数值,然后再相加,那么结果就是正确的。
请在编辑器里新建一份名叫convertDigitToInt.c的文件,并录入上述代码。然后编译程序并在终端窗口运行。你会看到类似下面这样的输出。

字符与计算机表示该字符时所用的值有何关系,我们会在第15章详细讲解。
[1] 实际上,char类型是带符号的还是无符号的,应该由C语言的每一种具体实现来决定。这段话可以理解成:对char类型所做的加减法,其结果不应超出一个字节所能表示的范围。——译者注