字符数据和整形数据在一定条件下可以相互转换。在所有的编译系统中,都规定以一个字节来存放一个字符,字符数据时以ASCII码存储的。如,字符‘a’,它的ASCII码是97,它的存储形式为:“01100001”(ASCII码为7位,所以第一位补0),而这与整型数据的存储方式没有什么区别(如果整型数据也是占一个字节的话),这就使得字符型数据和整型数据之间形成了通用。
可以将一个整数赋给一个字符变量,如下面的两句代码是等效的:
char c = 'a'; /*字符常量'a'赋值给c*/
char c = 97; /*将'a'的ASCII码赋值给字符变量c*/
执行第1行时,先将字符a转换为对应的ASCII码97,然后存放在变量c中;
执行第2行时,直接将整数97存放在变量c中。
二者的效果完全相同。但要注意的是,赋给字符变量的整数的数值范围是有限的(有效字符是有限的,不是所有的ASCII码中的字符都可以输出),范围为0~127,它们对应有效的字符。
字符数据既可以以字符形式(%c)输出,也可以以整数形式输出(%d)。按字符形式输出时,系统先将存储单元中的ASCII码转换成相应的字符,然后输出;按整数形式输出时,直接将ASCII码作为整数输出。
也可以把字符数据当做整型数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。
下面是一个小例子:
# include <stdio.h>
void main(){
char c1=97,c2=98;/*等价于char c1='a',c2='b'*/
printf("%c,%c,%d,%d\n",c1,c2,c1,c2);
c1=c1-32;
c2=c2-32;
printf("%c,%c,%d,%d\n",c1,c2,c1,c2);
}
输出结果为:
a,b,97,98
A,B,65,66
一个数据的值是由存储在存储单元中的二进制数值决定的,而输出的形式是有printf函数中的格式说明(%d,%c等)决定的。如果在内存中的97,用%d格式输出就是整数97,如果用%c格式输出就是字母a。