char类型可以是有符号(signed)类型,也可以是无符号(unsigned)类型,甚至是两者的混合类型,具体依赖于编译器的实现。
所以,当确定需要有符号的char类型时,请直接使用signed char;当确定需要无符号的char,则直接使用unsigned char。
char的这种模糊性,在涉及到符号问题时,需要分外小心。
例如,很常见的库函数getchar()的用法:
while ((ch = getchar()) != EOF) { ... }
这里如果变量ch定义为:
char ch;
则当char是无符号(unsigned char)实现时,代码无法工作。假设char占8bit,int占16bit,且内部表示使用二进制补码,则:
所以正确的做法是ch定义为int:
int ch;
这也是getchar()等库函数的返回值都是int的原因:
int getchar(void);