char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标准中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。

      ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char。char相当于signed char或者unsigned char,但是这取决于编译器!这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。signed char取值范围是 -128 到 127,unsigned char 取值范围是 0 到 255。但是char究竟相当于signed char呢还是相当于unsigned char呢?这就是char和int的不同之处!int==signed int,但是char不能简单以为==signed char。要确定char究竟等同什么要基于不同的编译器做测试,大多数机器使用补码来存储整数,在这些机器中按照整数类型存储的-1的所有位均是1,就能据此判断char究竟是等于signed char还是unsigned char

      判断编译器的默认char符号

#include <stdio.h>
int main(void)
{
    char c=-1;
    if(c<200)
    {
    printf("signed\n");
    }
    else
    {
    printf("unsigned\n");
    }
    return 0;
}