====== char类型的符号问题 ====== 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,且内部表示使用二进制补码,则: - EOF(-1)赋给ch时,转换成无符号数255,条件表达式变成(unsigned char)255 != (int)-1。 - 接下来进行[[.:binary_conversions|二元转换]]: * 在Traditional C下,-1转换成无符号整数65535,最终的条件表达式是(unsigned int)255 != (unsigned int)65535; * 在标准C下两者都转换成int,最终的条件表达式是(int)255 != (int)-1。 - 结果都导致永真循环。 所以正确的做法是ch定义为int: int ch; 这也是getchar()等库函数的返回值都是int的原因: int getchar(void); {{tag>C语言}}