我们知道,在C/C++语言中,char 也是一种普通的scalable 类型,除了字长之外,它与short,int,long 这些类型没有本质区别,只不过被大家习惯用来表示字符和字符串而已。(或许当年该把这个类型叫做“byte”,然后现在就可以根据实际情况,使用byte 或short 来把char 通过typedef 定义出来,这样更合适些)于是,使用”%d”或者”%x”打印一个字符,便能得出它的10 进制或16 进制的ASCII 码值;反过来,使用”%c”打印一个整数,便可以看到它所对应的ASCII字符。以下程序段把所有可见字符的ASCII 码对照表打印到屏幕上(这里采用printf,注意”#”与”%X”合用时自动为16 进制数增加”0X”前缀):
for(int i = 32; i < 127; i++)
{
printf("[ %c ]: %3d 0x%#04X\n", i, i, i);
}
把占用字节小的类型赋给占用字节大的类型时,会有符号位扩展问题,比如把char赋给int时,应当区别是1扩展还是0扩展。
示例1.1
void f(unsigned char v)
{
char c = v;
unsigned char uc = v;
unsigned int uia = c, uib = uc;
int i1 = c, i2 = uc;
printf("----------------\n");
printf("%%c: %c, %c\n", c, uc);
printf("%%X: %X, %X\n", c, uc);
printf("%%u: %u, %u\n", uia, uib);
printf("%%d: %d, %d\n", i1, i2);
}
f(0x80);
f(0x7F);
output:
%c: €, €
%X: FFFFFF80
%u: 42949671
%d: -128, 12
------------
%c: ,
%X: 7F, 7F
%u: 127, 127
%d: 127, 127