computer:c:tips:sign_of_char
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。
- 接下来进行二元转换:
- 在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);
computer/c/tips/sign_of_char.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1