响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


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,且内部表示使用二进制补码,则:

  1. EOF(-1)赋给ch时,转换成无符号数255,条件表达式变成(unsigned char)255 != (int)-1。
  2. 接下来进行二元转换
    • 在Traditional C下,-1转换成无符号整数65535,最终的条件表达式是(unsigned int)255 != (unsigned int)65535;
    • 在标准C下两者都转换成int,最终的条件表达式是(int)255 != (int)-1。
  3. 结果都导致永真循环。

所以正确的做法是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